Learning Card
ES6中的正则表达式有这样一些改变:
- RegExp构造函数的写法有了更新
- 可以是正则表达式+修饰符
- 新的修饰符
u
修饰符 Unicode模式y
修饰符 “粘连”修饰符
- 新的属性
unicode
属性 判断是否设置了u
修饰符sticky
属性 判断是否设置了y
修饰符flags
属性 返回正则表达式的修饰符
- 新规则
- 后行断言
- 先行断言写法
/x(?=y)/
- 先行否定断言写法
/x(?!y)/
- 后行断言写法
/(?<=y)x/
- 后行否定断言写法
/(?<!y)x/
- 先行断言写法
- 具名组匹配 给分组添加名字
- 后行断言
RegExp
构造函数
ES5中RegExp
构造函数写法
1 | // 写法1 参数:字符串 + 修饰符 |
不允许参数:正则表达式+修饰符
的形式,否则会报错
1 | let regex = new RegExp(/xyz/, 'i'); //Uncaught TypeError |
ES6写法
参数可以是正则表达式 + 修饰符
,且新指定的修饰符会覆盖原修饰符
1 | new RegExp(/abc/ig, 'i').flags // "i" |
新的修饰符
u
修饰符
u
修饰符指”Unicode模式”,用于正确处理大于\uFFFF
的Unicode字符。
y
修饰符
y
修饰符叫做”粘连“(sticky)修饰符。
它和g
修饰符类似,也是全局匹配,但是后一次匹配必须从上一次匹配成功的下一个位置开始。
1 | let str = 'aaa_aa_a'; |
新的属性
unicode
属性
unicode
属性表示是否设置了u
修饰符
1 | const r1 = /hello/; |
sticky
属性
sticky
属性表示是否设置了y
修饰符
1 | let r = /hello\d/y; |
flags
属性
flags
属性会返回正则表达式的修饰符
1 | //ES5的 source 属性会返回正则表达式的正文 |
新规则
后行断言
JavaScript原本只支持先行断言和先行否定断言。ES2018引入后行断言。
先行断言指,只有x
在y
前面才匹配,写成**/x(?=y)/
,比如匹配百分号之前的数字,写成/\d(?=%)/
,先行否定断言指石油x
不在y
前面才匹配,写成/x(?!y)/
**。这两个规则在正则表达式这一节中提到过。
后行断言与先行断言相反,只有x
在y
后面才匹配,写成**/(?<=y)x/
,比如只匹配没有符号之后的数字,要写成/(?<=\$)\d+/
。同样地,后行否定断言只有x
不在y
后面才匹配,写成/(?<!y)x/
**。
断言 | 否定断言 | |
---|---|---|
先行 | /x(?=y)/ |
/x(?!y)/ |
后行 | /(?<=y)x/ |
/(?<!y)x/ |
具名组匹配
正则表达式中使用圆括号进行组匹配,并将匹配结果分别提取出来,但是每一组的匹配含义并不清晰,只能通过序号来引用。
1 | const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/; |
ES2018引入了具名组匹配(Named Capture Groups),允许为每一个组匹配指定一个名字。
1 | const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; |
ES6学习笔记的内容主要基于阮一峰老师的《ECMAScript 6入门》,原文请见链接