ES9 中的正则表达式:(?<=) 和 (?<!) 的使用方法

阅读时长 3 分钟读完

在 ES9 中,新增了两个正则表达式的零宽断言:(?<=)(?<!)。它们分别表示正向先行断言和反向先行断言,在编写复杂的正则表达式时,可以起到相当大的帮助作用。

什么是零宽断言

在正则表达式中,零宽断言指的是,匹配只是判定位置是否符合要求,而不占据实际匹配的数据,即不消费字符。

在 ES9 中,(?<=)(?<!) 分别对应正向先行断言和反向先行断言,它们都是零宽断言。

(?<=) 的使用方法

(?<=) 表示正向先行断言,用于判断位于匹配结果左侧的字符内容是否符合某个条件。

该断言的语法如下:

其中,exp 表示判断条件,content 表示需要匹配的内容。只有当 exp 符合条件时,才会匹配 content

下面通过示例来说明 (?<=) 的使用方法:

在上述示例中,正则表达式 /(?<=\d{3})\$/g 用于匹配字符串中 $ 符号左侧有 3 个数字的情况。其中,(?<=\d{3}) 表示匹配符合条件(即左侧有 3 个数字)的情况,才会匹配右侧的 $ 符号。

在字符串 2020年11月19日,收入:$1234.56,支出:$987.65 中,符合条件的只有 $1234.56 中的 $ 符号,因此最终的匹配结果为 ['$']

(?<!) 的使用方法

(?<!) 表示反向先行断言,与 (?<=) 相反,用于判断位于匹配结果右侧的字符内容是否符合某个条件。

该断言的语法如下:

其中,exp 表示判断条件,content 表示需要匹配的内容。只有当 exp 不符合条件时,才会匹配 content

下面通过示例来说明 (?<!) 的使用方法:

在上述示例中,正则表达式 /(?<=[^@]+@)/g 用于匹配字符串中 @ 符号右侧的 email 地址。其中,(?<=[^@]+@) 表示匹配符合条件(即右侧没有 @ 符号)的情况,才会匹配左侧的 email 地址。

在字符串 用户:张三,邮箱:zhangsan@qq.com 中,符合条件的只有 zhangsan@qq.com 中的 qq.com,因此最终的匹配结果为 ['qq.com']

总结

ES9 中新增的正向先行断言 (?<=) 和反向先行断言 (?<!) 是零宽断言的两种形式,它们可以帮助开发者更加准确地编写复杂的正则表达式。

需要注意的是,在使用零宽断言时,语法一定要正确,否则会导致匹配失败,最终结果也不符合预期。因此,需要结合实际需求和学习,多练习正则表达式的编写,才能更加熟练地运用这些语法。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b55d7968c7c53b0dae298

纠错
反馈