正则表达式的声明
- 使用字面量形式
var patt = /正则表达式/修饰符;
var patt = /a/gi;
- 使用new关键字声明; 参数都是字符串
var patt = new RegExp(正则表达式, 修饰符)
参数解析:
- 正则表达式:由一些具有特殊的含义的字符组成
- 修饰符: g 全局匹配 ; i 不区分大小; m 多行匹配
- 两种声明方式的区别
- 字面量形式不能使用变量存储正则表达式, 但是使用new 关键字可以使用变量存储正则表达式
正则表达式的语法
正则的组成: 正则表达式由 元字符,字符类,量词组成
元字符
- ^ : 以什么作为开头
- $ : 以什么作为结束
- . : 除空白符以外的任意一个字符
- [] : 匹配在[]范围内任意一个字符
- [^] : 除了[]范围内的任意一个字符
字符类
- [a-z] : 匹配小写字母 a 到 z
- [A-Z] :匹配大写字母 a 到 z
- [0-9] : 匹配的是数字
- \w : 匹配 下划线, 小写字母 a 到 z,大写字母 A 到 Z;数字0-9; 等价形式[a-zA-Z0-9_]
- \W :匹配的是 除了上边以外的所有字符; 等价形式[^a-zA-Z0-9_]
- \d : 匹配的是数字 ,等价形式 [0-9]
- \D : 匹配的是除了数字以外的字符
- \s : 匹配的是空白符
- \S : 匹配除了空白符以外的字符
量词
- *: 匹配0次或者多次
- +:匹配1次或者多次
- ?: 匹配0次或者1次
- {n} : 匹配n次
- {n,} : 至少匹配n次, 最多没限制
- {n,m} : 至少匹配n次,最多匹配m次
匹配模式
- 贪婪模式 : 尽可能多的匹配 ; + * {n,} {n,m}
- 惰性模式 : 尽可能少的匹配 ; +? *? {n,}? {n,m}?
候选 |
var patt = /red|blue/;
分组 ()
var patt = /(kid){3}/ // kid 作为整体进行匹配三次
var patt = /kid{3}/ // d匹配三次
反向引用 ()
反向引用引用的是匹配的结果,不是匹配规则
// var res = /(['"])[^\1]*\1/.test('\"Tom\"');
var res = /(['"])[^\1]*\1/.test('\"Tom\'');
console.log(res)
注意:反向引用 $1 或者是 \1 :数字是左括号的顺序
var str = "todayhelloworldTom";
var patt = /(today)(hello(world(Tom)))/g;
var res = patt.test(str);
var val1 = RegExp.$1; // todayhelloworldTom
var val2 = RegExp.$2 // helloworldTom
var val3 = RegExp.$3 // worldTom
var val4 = RegExp.$4 // Tom
console.log(val1, val2, val3, val4)
只分组,不引用 ?:
有时只需要分组,不需要进行反向引用,使用(?:)可以解决
var patt = /(hello(?:world))/;
正向前瞻 和 负向前瞻
- 正向前瞻 exp1(?=exp2) :exp1表达式的后边只能是exp2代表的表达式才能匹配成功
var patt = /hello(?=wolrd)/;
- 负向前瞻 exp1(?!exp2) : exp1表达式的后边只要不是exp2代表的表达式就匹配成功
var patt = /hello(?!wolrd)/;
字符串中和正则相关的方法
- match(patt) : 找到一个或者多个匹配; 结果是一个数组,如果没有使用全局匹配修饰符g, 结果只有一个, 找到的是第一个匹配的值; 如果使用的g, 则结果有多个
var Str = '123542435346467333';
// var res = Str.match(/\d{3,5}?/g);
var res = Str.match(/\d{3,5}?/);
console.log(res)
// 没有使用修饰符g:
["123", index: 0, input: "123542435346467333", groups: undefined]
0: "123"
groups: undefined
index: 0
input: "123542435346467333"
length: 1
__proto__: Array(0)
// 使用修饰符 g
["123", "542", "435", "346", "467", "333"]
- repalce(patt, newStr) : 替换于正则表达匹配的字符串
- search(patt) : 检索是否存在和正则表达式匹配的字符; 存在的返回值为第一次匹配位置的索引值; 如果不存在,返回值为 -1 ; 不能识别全局修饰符 g; 但是可以识别修饰符 i;
正则对象的方法
- test() : 判断字符串是否符合正则规则, 结果是布尔值, true: 符合规则, false: 不符合规则
- exec() : 检索字符串中是否存在符合正则规则的子串,结果是数组, 每执行一次exec()方法,都会得到一个结果; 因为RexExp对象的 lastIndex 属性 记录每一次匹配位置的索引值; 下次匹配从lastIndex记录的位置开始
因此,检索所有的结果, 需要借助循环
var str = '12342354324534456345';
var patt = /\d{3,5}/g;
var res ;
while(res = patt.exec(str)){
console.log(res);
}