RegExp构造函数
在es5中,RegExp
构造函数的参数有两种情况
第一种,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)。
var regex = new RegExp('xyz','i')
//等价于
var regex=/xyz/i;
第二种,参数是一个正则表达式,这时返回一个原有正则表达式的拷贝。
var regex=new RegExp(/xyz/i);
//等价于
var regex = new RegExp(/xyz/,'i');
但是es5不允许此时使用第二个参数添加修饰符,否则会报错。
var regex=new RegExp(/abc/ig,'i').flags
ES6 改变了这种行为。如果RegExp
构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
y修饰符
es6位正则表达式添加了y
修饰符,叫做"粘连"(sticky)修饰符。
y
修饰符的作用与g
修饰符类似,也是全局匹配,后一次匹配都是从上一次匹配成功的下一个位置开始。但y
修饰符确保匹配必须从剩余的第一个位置开始,这也就是"粘连"的涵义。
var s='aaa_aa_a';
var r1=/a+/g;
var r2=/a+/y;
r1.exec(s) // ['aaa']
r2.exec(s) // ['aaa']
r1.exec(s) //["aa"]
r2.exec(s) // null
stick 属性
与y
修饰符相匹配,es6的正则对象多了sticky
属性,表示是否设置了y
修饰符。
var r=/hello\d/y;
r.sticky
flags 属性
es6为正则表达式新增了flags
属性,会返回正则表达式,会返回正则表达式的修饰符。
// es5 的 source 属性
// 返回正则表达式的正文
/abc/ig.source
// "abc"
// es6 的 flags 属性
// 返回正则表达式的修饰符
/abc/ig.flags
// 'gu'
后行断言
javascript 语言的正则表达式,只支持先行断言( lookhead )和先行否定断言( negative lookhead ),不支持后行断言( lookbehind )和后行否定断言( negative lookbehind )。目前,有一个提案,引入后行断言,v8引擎 4.9版已经支持。
"先行断言"指的是,x
只有在y
前面才匹配,必须写成/x(?=y)/
。比如,只匹配百分号之前的数字,要写成/\d+(?=%)
。"先行否定断言"指的是,x
只有不在y
前面才匹配,必须写成/x(?!y)/
。比如,职匹配不在百分号之前的数字,要写成/\d+(?!%)/
。
/\d+(?=%)/.exec('100% of US presidents have been male') // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them') // ["44"]
“后行断言”正好与“先行断言”相反,x
只有在y
后面才匹配,必须写成/(?<=y)x/
。比如,只匹配美元符号之后的数字,要写成/(?<=\$)\d+/
。”后行否定断言“则与”先行否定断言“相反,x
只有不在y
后面才匹配,必须写成/(?<!y)x/
。比如,只匹配不在美元符号后面的数字,要写成/(?<!\$)\d+/
。
/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill') // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90') // ["90"]