参考书《ECMAScript 6入门》
http://es6.ruanyifeng.com/

正则的扩展

ES6新增的正则表达式修饰符

u修饰符
a.能够更准确地匹配unicode大于\uFFFF的unicode,如 /\uD83D/u.test('\uD83D\uD2A')----false
b.有助于增强.字符(表示除了换行字符以外的任意字符)正则表达式的正确性 /^.$/u  可以识别任何除换行符以外的字符,包括unicode编码超过\uFFFF的字符
c.识别unicode新表示法中的{}
如 : "𠮷" 是一个unicode编码超过\uFFFF范围的汉字
     "𠮷"的十进制编码 "𠮷".CodePointAt(0)--->134071
     "𠮷"的十六进制编码 "𠮷".CodePointAt(0).toString(16)---->"20bb7"
     "𠮷"的unicode编码 \u20bb7 或者\u{20bb7}     /\u20bb7/.test("𠮷")---->false   /\u20bb7/u.test("𠮷")---->false  /\u{20bb7}/u.test("𠮷")---->true
d.使量词可以正确识别unicode编码大于\uFFFF的字符

/\u{20bb7}{3}/u.test("𠮷𠮷")--->false    /\u{20bb7}{2}/u.test("𠮷𠮷")---->true     /\u{20bb7}{2}/.test("𠮷𠮷")---->false

c.加上u修饰符可以帮助带有元字符的正则表达式识别unicode编码大于\uFFFF的字符

/\s/u

e.加上u修饰符有助于判断一些不规范的unicode编码

y修饰符

加上y修饰符,表示判断一个字符串是否发生了“粘连”。即每次匹配的剩余字符是否从头部开始匹配y修饰符修饰的正则表达式

s修饰符
s修饰符可以使.匹配包括换行符在内的任何字符
/a.b/.test(a\nb)---->false
/a.b/s.test(a\nb)--->true

ES6新增的正则表达式属性
let c = new RegExp(/a.b/,'s');
flags  : 可以返回一个正则表达式实例所使用的修饰符   c.flags = 's'
sticky : 用于判断一个正则表达式实例是否使用了y修饰符 c.sticky = false
dotAll : 用于判断一个正则表达式实例是否使用了s修饰符  c.dotAll = true
/**ES6之前已经存在的属性  source : 可以返回一个正则表达式实例所使用的的表达式正文 c.source = 'a.b'*/

先行断言 : 先行即匹配顺序“从左到右”
如:匹配出一个字符串中右边紧挨着字母的数字
/\d+(?=[a-z]+)/.exec("1234,.;';123456abcd")--->["123456", index: 9, input: "1234,.;';123456abcd"]
先行否定断言
如:匹配出一个字符串中右边紧挨着非字母的数字
/\d+(?![a-z]+)/.exec("1234,.;';123456abcd")--->["1234", index: 0, input: "1234,.;';123456abcd"]

后行断言 : 后行即匹配顺序“从右到左”
如:匹配出一个字符串中左边紧挨着字母的数字
/(?<=[a-z]+)\d+/.exec("1234,.;';123456abcd7890")---->["7890", index: 19, input: "1234,.;';123456abcd7890"]
后行否定断言
如:匹配出一个字符串中左边紧挨着非字母的数字
/(?<![a-z]+)\d+/.exec(",.;';123456abcd7890")---->["123456", index: 5, input: ",.;';123456abcd7890"]

具名组匹配 : ?<name>

var c = new RegExp(/(?<characters>\w+)-(?<numbers>\d+)-(?<symbols>\S+)/,'su');
var result = c.exec(abcd-1234-****);
result.groups.characters : abcd
result.groups.numbers : 1234
result.groups.symbols : ****
result.groups.test : undefined 没有匹配到或者没有生命的组名都会返回undefiend

字符串的replace方法中中可以使用$<name>引用到具组名具体匹配到的值

正则表达式中可以使用\k<name>的方式代表前面定义的正则表达式组部分 /(?<numbers>\d+)\k<numbers>/ 等同于 /(?<numbers>\d+)(?<numbers2>\d+)/  (number2实际意思与numbers相同,只是一个正则表达式中不能使用两个相同的组名)

新的\p{}和\P{}写法
\p{UnicodePropertyName=UnicodePropertyValue} 表示匹配满足条件的字符
\P{UnicodePropertyName=UnicodePropertyValue} 表示匹配不满足条件的字符
/\p{...}/u   /\P{...}/u  必须和u修饰符配合使用,否则报错

matchAll
string.matchAll(regex)返回的是遍历器,所以可以用for...of循环取出