在 ES9 中,新增了两个正则表达式的零宽断言:(?<=)
和 (?<!)
。它们分别表示正向先行断言和反向先行断言,在编写复杂的正则表达式时,可以起到相当大的帮助作用。
什么是零宽断言
在正则表达式中,零宽断言指的是,匹配只是判定位置是否符合要求,而不占据实际匹配的数据,即不消费字符。
在 ES9 中,(?<=)
和 (?<!)
分别对应正向先行断言和反向先行断言,它们都是零宽断言。
(?<=)
的使用方法
(?<=)
表示正向先行断言,用于判断位于匹配结果左侧的字符内容是否符合某个条件。
该断言的语法如下:
(?<=exp) content
其中,exp
表示判断条件,content
表示需要匹配的内容。只有当 exp
符合条件时,才会匹配 content
。
下面通过示例来说明 (?<=)
的使用方法:
// 匹配 $ 符号左侧有 3 个数字的情况 let str = '2020年11月19日,收入:$1234.56,支出:$987.65'; let reg = /(?<=\d{3})\$/g; console.log(str.match(reg)); // ['$']
在上述示例中,正则表达式 /(?<=\d{3})\$/g
用于匹配字符串中 $
符号左侧有 3 个数字的情况。其中,(?<=\d{3})
表示匹配符合条件(即左侧有 3 个数字)的情况,才会匹配右侧的 $
符号。
在字符串 2020年11月19日,收入:$1234.56,支出:$987.65
中,符合条件的只有 $1234.56
中的 $
符号,因此最终的匹配结果为 ['$']
。
(?<!)
的使用方法
(?<!)
表示反向先行断言,与 (?<=)
相反,用于判断位于匹配结果右侧的字符内容是否符合某个条件。
该断言的语法如下:
(?<!exp) content
其中,exp
表示判断条件,content
表示需要匹配的内容。只有当 exp
不符合条件时,才会匹配 content
。
下面通过示例来说明 (?<!)
的使用方法:
// 匹配 用户名 后面的 email 地址 let str = '用户:张三,邮箱:zhangsan@qq.com'; let reg = /(?<=[^@]+@)/g; console.log(str.match(reg)); // ['qq.com']
在上述示例中,正则表达式 /(?<=[^@]+@)/g
用于匹配字符串中 @
符号右侧的 email 地址。其中,(?<=[^@]+@)
表示匹配符合条件(即右侧没有 @
符号)的情况,才会匹配左侧的 email 地址。
在字符串 用户:张三,邮箱:zhangsan@qq.com
中,符合条件的只有 zhangsan@qq.com
中的 qq.com
,因此最终的匹配结果为 ['qq.com']
。
总结
ES9 中新增的正向先行断言 (?<=)
和反向先行断言 (?<!)
是零宽断言的两种形式,它们可以帮助开发者更加准确地编写复杂的正则表达式。
需要注意的是,在使用零宽断言时,语法一定要正确,否则会导致匹配失败,最终结果也不符合预期。因此,需要结合实际需求和学习,多练习正则表达式的编写,才能更加熟练地运用这些语法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b55d7968c7c53b0dae298