在 ES9 中,正则表达式新增了一些功能,其中就包括 Lookbehind(前瞻零宽断言)和后顾零宽断言。
Lookbehind 可以理解为在匹配正则表达式时,后面的字符符合某个条件时才会匹配前面的字符,在 JavaScript 中不支持 Lookbehind,但是 ES9 中引入了这个特性。后顾零宽断言与之类似,只不过是后面的字符匹配前面的字符。
虽然 Lookbehind 和后顾零宽断言在某些场景下非常实用,但是在使用时也需要注意一些问题。
Lookbehind 的使用
Lookbehind 的使用方法是在正则表达式中添加 (?<=...)
,其中 ...
表示一个条件,只有在条件符合时才会匹配前面的字符。例如要匹配 '1a'
中的 'a'
,但是前面必须有一个 '1'
,可以使用 /(?<=1)a/
。
const str = '1a2b3c4d' console.log(str.match(/(?<=1)a/)) // ['a']
除了 (?<=...)
,还有一种反向前瞻零宽断言 (?<!...)
,表示除了 ...
之外的条件,才会匹配前面的字符。例如要匹配 '0a'
中的 'a'
,但是前面不能有一个 '1'
,可以使用 /(?<!1)a/
。
const str = '0a1b2c3d' console.log(str.match(/(?<!1)a/)) // ['a']
需要注意的是,Lookbehind 只能向左匹配,即后面的字符匹配前面的字符,而不能向右匹配。
后顾零宽断言的使用
后顾零宽断言使用方法是在正则表达式中添加 (?<=...)
,其中 ...
表示前面必须有某个条件时才匹配后面的字符。例如要匹配 'a1'
中的 'a'
,但是后面必须有一个 '1'
,可以使用 /(?<=1)a/
。
const str = '0b1a2c3d' console.log(str.match(/(?<=1)a/)) // ['a']
除了 (?<=...)
,还有一种反向后顾零宽断言 (?<!...)
,表示除了 ...
之外的条件,才会匹配后面的字符。例如要匹配 'a0'
中的 'a'
,但是后面不能有一个 '1'
,可以使用 /(?<!1)a/
。
const str = '0a1b2c3d' console.log(str.match(/(?<!1)a/)) // ['a']
需要注意的是,后顾零宽断言只能向右匹配,即前面的字符匹配后面的字符,而不能向左匹配。
注意事项
需要注意的是,在使用 Lookbehind 和后顾零宽断言时,一定要先判断当前 JavaScript 的运行环境是否支持这个特性。如果不支持,代码将会抛出错误。此外,这个特性有一些限制,例如无法匹配变长的模式。在使用时一定要注意这些问题,避免出现错误。
总结
Lookbehind 和后顾零宽断言是 ES9 新增的正则表达式特性,能够在匹配时增加一些条件限制,提高匹配的精度和准确性。在使用时需要注意合理使用,避免出现错误。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a3d9f248841e98940446ef