正则 - 阅读笔记

180 阅读1分钟

反向引用

括号可以记住他们匹配的文本

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

?!^ 使用到的是正序否定环视