ES5中,正则表达式构造函数的参数有两中情况:
①:new RegExp(string,flag);如var reg=new RegExp('xyz','i')
;
②:new RegExp(regexp);如var reg=new RegExp(/xyz/i)
;
采用第二种方式创建时,不允许传递第二个参数flag,否则会报错,但ES6允许
1. 字符串的正则方法
字符串对象共有4个方法可以使用正则表达式:
match()、replace()、search()、split()
;ES6使者4个方法在语言内部实现时全部调用RegExp的实例方法,进而保证所有与正则相关的方法都定义在RegExp对象上;
- String.prototype.match 调用RegExp.prototype[Symbol.match];
- String.prototype.replace调用RegExp.prototype[Symbol.replace];
- String.prototype.search 调用RegExp.prototype[Symbol.search];
- String.prototype.split 调用RegExp.prototype[Symbol.split];
2.RegExp正则表达式修饰符
ES5正则表达式的修饰符有三个:
- ①
i
:case-insensitive,即不区分大小写模式,匹配时忽略大小写; - ②
g
: global,即全局模式,模式将被引用于所有字符串; - ③
m
:multiline,即多行模式,在达到一行文本末尾时还会继续查找下一行是否存在匹配项;
ES6新增4个修饰符:
- ①
y
:sticky,即粘连,后一次匹配从上一次匹配成功的下一个位置开始; - ②
u
:unicode,即UTF-16修饰符,用来处理4个字节(大于uFFFF)的UTF-16编码unnicode字符; - ③
s
:dotAll,即匹配包括行终止符的任意字符;
3.新增特性
- 后行断言
JAvaScript语言的正则表达式仅支持现行断言和现行否定断言;ES6提案支持后行断言和后行否定断言;
①先行断言:
/d+(?=%)/.exec('100% of US prisident.'); // ['100'] 仅匹配%之前的数字
/d+(?!%)/.exec('that is to say 33'); //['33'] 仅匹配不在%之前的数字
②后行断言
/(?<=$)d+/.exec('I have $100');//['100'] 仅匹配$符号后面的数字
/(?!$)d+/.exec('It is worth about ¥90');//['90] 仅匹配不在$后面的数字
- unicode属性
p{expression}
:允许正则表达式匹配符合unicode某种属性的所有字符; - 具名组匹配:
①ES5 正则表达式允许使用圆括号进行组匹配:
const exp=/(d{4})-(d{2})-(d{2})/;
const res=exp.exec('2017-12-19');
const year=res[1]; // 2017
const month=res[2]; // 12
const day=res[3]; //19
②ES6提案有一个具名组正则匹配表达式
const reg=/(<?year>d{4})-(<?month>d{2})-(<?day>d{2})/;
const res=reg.exec('2017-12-19');
const year=res.group.year;//2017
const month=res.group.month;//12
const day=res.group.day;// 19
③具名组引用k<name>
const reg=/(<?year>d{4})-(<?month>d{2})-k<month>/
const reg.exec('2017-12-19');// ture