一、定义
正则表达式(Regular Expression),使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
二、基本语法
元字符
正则表达式中有特殊含义的非字母字符
字符类
[] 可以构建一个类,比如 [abc], 匹配含有 a 或 b 或 c
字符类取反
[^] 表示匹配一个未列出的字符,而不是匹配列出的字符
var reg = /[^ab]/g;
var string = "acdadbb";
string.replace(reg, "A"); // 结果为"aAAaAbb"
范围类
[], 匹配一个范围,在其类内部是可以连写的,例如
[a-zA-z] // 匹配26个字母的大小写
预定义类
1、 . 匹配除回车符合换行符之外的所有字符
2、 \d匹配数字字符
3、 \D匹配非数字字符
4、 \s匹配空白符
5、 \S匹配非空白符
6、 \w匹配单词字符(字符、数字下划线)
7、 \W匹配非单词字符
注意大小写区分
边界
1、 ^ 开始
2、 $ 结束
3、 \b单词边界
4、 \B非单词边界
量词
1、 ? 匹配之前紧邻的元素,这个元素可以不出现,且匹配成功(最多出现一次)
2、 + 表示之前紧邻的元素出现一次或者多次,无法进行一次匹配时,会报告匹配失败(最少出现一次)
3、 * 表示之前紧邻的元素任意出现多次或者不出现字符组里面的一些字符不是元字符。(任意次)
4、 {n} 出现 n 次
5、 {n, m} 出现 n 到 m 次
6、 {n, } 至少出现 n 次
分组
1、 ()
// 匹配一个字母加一个数字的前两个组合
var reg1 = /[a-z]\d{2}/g;
var reg2 = /([a-z]\d){2}/g; //增加()
var string = "a1c2d3adbb";
string.replace(reg1, "A"); // 结果为"a1c2d3adbb", 没有改变
string.replace(reg2, "A"); // 结果为"Ad3adbb"
2、 或 |
var reg = /h(o|i)t/g;
var string = "hothithat";
string.replace(reg, "A"); // 结果为AAhat
3、 反向引用
例如日期格式的转换,由2016-08-16转换为08/16/2016
var reg = /(\d{4})-(\d{2})-(\d{2})/g;
var string = "2016-08-16"
string.replace(reg, "$2/$3/$1"); // 结果为08/16/2016
其中 $1 表示第一组括号匹配的文本,其他类似
4、忽略分组
在分组上加上 ?:
var reg = /(\d{4})-(?:\d{2})-(\d{2})/g;
var string = "2016-08-16";
string.replace(reg, "$2/$3/$1"); // 结果为16/$3/2016, 月份已经被忽略,无法通过$数字进行访问
前瞻
本文尾部方向,为 前
正向前瞻:exp(?=assert)
负向前瞻:exp(?!assert)
前瞻:匹配到规则的时候,向前检查是否符合断言,JavaScript不支持后顾
var reg = /\w(?=\d)/g; // 找到字母后,判断是不是有数字,有的话才符合,替换掉这个字母,但是数字不会替换
var string = "h2othi2";
string.replace(reg, "A"); // 结果为A2othA2
三、匹配模式
贪婪模式
极可能多的匹配
var reg = /\d{3, 6}/g;
var string = "123456789";
string.replace(reg, "A"); // 结果为A789,尽可能多匹配
非贪婪模式
让正则表达式尽可能少的匹配,一旦匹配成功就不再继续尝试。方式是在量词后加上?
var reg = /\d{3, 6}?/g;
var String = "123456789";
string.replace(reg, "A"); // 结果为 "AAA", 尽可能少匹配
四、RegExp 对象
创建方法
有两种方法可以创建RegExp对象
a、显示构造函数
var reg = new RegExp("patern"[, "flag"]);
b、隐式构造函数
var reg = /pattern/[flags];
其中, flags可以是一些标志字符的组合
g 为全局标志,将对所有匹配的部分起作用,如果不设置,仅搜索和替换最早匹配的内容
i 为忽略大小写的标志,如果设置,忽略大小写
m 为多行标志,如果设置, "^"还可以与被搜索字符串的 n 或 r 之后的位置进行匹配
例如:
/ab+c/i;
new RegExp("ab+c", "i");
RegExp对象的属性
global: 布尔值
ignoreCase: 布尔值
lastIndex: 整数,表示开始搜索下一个匹配项的字符位置
multiLine: 布尔值
source: 正则表达式的字符串表示
RegExp对象的方法
exec
rgExp.exc(str)
返回值:如果没有找到匹配返回null,如果找到返回一个数组
返回的数组有三个属性,分别是input、index 和 lastIndex
input 包含了查找的字符串,
index 属性包含了整个被查找字符串中被匹配的字符串的位置,
lastIndex 属性中包含了最后一次匹配中最后一个字符的下一个位置
test
rgexp.test(str)
返回值:如果存在一个模式,返回true
match
stringObj.match(rgExp)
返回值:如果没有找到匹配返回null,如果找到则返回一个数组
返回数组有三个属性,分别是input、index 和 lastIndex
input 包含了查找的字符串,
index 属性包含了整个被查找字符串中被匹配的字符串的位置,
lastIndex 属性中包含了最后一次匹配中最后一个字符的下一个位置
search
stringObj.search(rgExp)
返回值:如果存在返回一个整数值,指明这个匹配距离字符串开始的偏移位置。没有找到则返回 -1
replace
replace(rgExp, replaceText)
split
split([separator[, limit]])
separator 分割标识符参数,可以是多个字符或一个正则表达式 limit限制返回元素的个数