正则表达式的顺序优先级

前言

假设存在匹配示例:匹配a-c@或a@

你认为正则a|(a-c)(?=\W)与(a-c)|a(?=\W)都能匹配上面的示例吗?这2个正则有什么本质区别?哪一个才是正确的写法?--这就涉及了正则表达式的顺序优先级,本文将解释这一点。

什么是正则表达式的顺序优先级呢?在正则表达式中,| 前后的表达式的顺序是有讲究的,如expression1|expression2和expression2|expression1匹配的结果或许存在不同,在编辑正则表达式时要有这样意识,否则编辑出的正则可能不符需求。

 

举例说明

示例1

源字符串:

a-c@  

a@

正则表达式:

a|(a-c)(?=\W)

(a-c)|a(?=\W)

 

匹配结果:a|(a-c)(?=\W)能够匹配a@,但不能匹配a-c@;(a-c)|a(?=\W)则都可以匹配。

原因:(a-c)|a(?=\W)先匹配a-c这个整体,如果匹配失败则进行回溯,尝试匹配a,所以@前的a-c或a都是可匹配的;a|(a-c)(?=\W)能够匹配a@自不必说,但为什么不能匹配a-c@呢?因为它匹配a,剩下-c@,-匹配(?=\W)成功,整个正则匹配成功,匹配结果为:a

 

示例2

源字符串:

1

01

11

正则表达式:

(0?[123456789]|(1[012]))

((1[012])|0?[123456789])

 

匹配结果:(0?[123456789]|(1[012]))可匹配1与01,不可匹配11;((1[012])|0?[123456789])可匹配所有的源字符串。

原因:同示例1。

 

小结

如本文开头所问,a|(a-c)(?=\W)与(a-c)|a(?=\W)的本质区别--后者的匹配广度高于前者,所以(a-c)|a(?=\W)才是符合需求的。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值