构造函数
- 在ES6中可以这样定义正则表答式
const reg=new RegExp(/asd/gi,'i');
第二个模式会覆盖之前原正则表达式中的模式(ES5中不支持这么做);
字符串方法
- 字符串中的方法match()、replace()、search()和split(),可能会用到正则表达式,在ES6中这些方法的用法不变,但是内部的调用方式由String的实例对象变成了RegExp的实例对象
修饰符u
- 在ES6中新增了u修饰符,用于匹配unicode16的字符
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true
- 在ES5中.字符用于匹配除换行之外的所有单个字符,但是无法匹配Unicode16的字符,在ES6中可以使用u操作符进行匹配
var s = '𠮷';
/^.$/.test(s) // false
/^.$/u.test(s) // true
- 只有在加了修饰符u之后,所有量词才会按Unicode匹配大于)0xFFFF的字符
/𠮷{2}/.test('𠮷𠮷') // false
/𠮷{2}/u.test('𠮷𠮷') // true
- u也会影响到一些预定义模式,如\S匹配所有不是空格的字符,但无法匹配码点大于)0xFFFF的字符,此时可以加上u修饰符
/^\S$/.test('𠮷') // false
/^\S$/u.test('𠮷') // true
修饰符y
此修饰符与g修饰类似,都是全局修饰符,后一个匹配过程会从前一个配成功的位置下一个开始,但是y修饰符必须以后一个开始的字符作为第一个用于匹配的字符,而g修饰符表示后文中包含即可。
举个栗子:
const str='asdasd_asdasd';
const reg_y=/asd/y;
const reg_g=/asd/g;
reg_y.exec(str);
//["asd", index: 0, input: "asdasd_asdasd"]
reg_y.exec(str);
//["asd", index: 3, input: "asdasd_asdasd"]
reg_y.exec(str);
//null
reg_g.exec(str)
//["asd", index: 0, input: "asdasd_asdasd"]
reg_g.exec(str)
//["asd", index: 3, input: "asdasd_asdasd"]
reg_g.exec(str)
//["asd", index: 7, input: "asdasd_asdasd"]
reg_g.exec(str)
//["asd", index: 10, input: "asdasd_asdasd"]
- 由此,在ES6中正则对象多设置了sticky用以检测是否设置了y修饰符
reg_g.sticky
\\false
reg_y.sticky
\\true
- 在ES6中在正则对象中也新增了属性flags,该属性用来返回正则对象的修饰符。
修饰符s:dotAll(提案)
- 我们已知预定义模式.可以匹配除行终止符(换行,回车等)外的其他一切字符,但有时我们需要匹配任意字符,这是.就显得有些不堪使用了,于是有提议是添加s修饰符使.可以匹配任意字符, 但目前好像还没有添加使用(2017/10/15)
Google Chrome 61.0.3163.91 (64-bit) JavaScript V8 6.1.534.37
后行断言
先行断言
- 是指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')
后行断言
- “后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=$)\d+/。”后行否定断言“则与”先行否定断言“相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!$)\d+/。
const RE_DOLLAR_PREFIX = /(?<=\$)foo/g;
'$foo %foo foo'.replace(RE_DOLLAR_PREFIX, 'bar');
// '$bar %foo foo'
网友评论