反向引用
括号可以记住他们匹配的文本
const str = 'abcabc反反复复方法edfedfdddd'
const end = str.match(/(abc)\1.*(edf)\2/g)
console.log(end)
// [ 'abcabc反反复复方法edfedf' ]
在一个表达式中可以用 \1\2\3 来表示第一,第二,第三个括号匹配到的文本
const str = 'abc12322abcfff'
const end = str.match(/(abc)\d+\1/)
// 'abc12322abc'
非捕获
我们知道在正则里用括号可以捕获文本。那只想匹配,不想捕获如何处理
/(\d+)(?:[a-z]+)(\d+)/
添加 ?:
环视匹配
环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。顺序环视相当于在当前位置右侧附加一个条件,而逆序环视相当于在当前位置左侧附加一个条件。
环视不会占用字符,只是用来标记位置
| 表达式 | 说明 |
|---|---|
| (?=Expression) | 正序环视,表示所在位置右侧匹配Expression |
| (?!Expression) | 正序否定环视,表示所在位置右侧不能匹配Expression |
| (?<=Expression) | 逆序环视,表示所在位置左侧能够匹配Expression |
| (?<!Expression) | 逆序否定环视,表示所在位置左侧能够不匹配Expression |
例如
const str = 'a little boy, lityyyyy123'
const end = str.match(/(?=lityyyyy)lit/g)
console.log(end)
// lit
以上正则只会匹配 lityyyyy 字符里的 lit
这个功能可以使用在数字千分位处理上
const str = '12345678'
const res = str1.replace(/(?=(\d{3})+$)/g, ',')
// 12,345,678
这里有需要处理下开头逗号,当是数值个数是3整数的时候,开头位置也会加一个, 是有问题的
const str = '123456789'
const res = str1.replace(/(?!^)(?=(\d{3})+$)/g, ',')
// 123,456,789
?!^ 使用到的是正序否定环视