蜗牛随笔

博客园 首页 联系 订阅 管理

正则中有一类,在匹配时不消费掉匹配的字符,这种是断言检测。但注意的是,

正则表达式——非捕获匹配
英文名称 名称 正则 含义 举例 匹配到 不匹配
断言检测 非捕获匹配 (?:pattern) 预查不消耗字符 industr(?:y|ies) industry|industries  
positive lookahead 前向肯定预查 (?=pattern) 正向查看是否满足 Windows(?=95|98|NT|2000) “Windows2000”中的“Windows” “Windows3.1”中的“Windows”
positive lookbehind 后向肯定预查 (?<=pattern) 负向查看是否满足 (?<=95|98|NT|2000)Windows 2000Windows”中的“Windows” 3.1Windows”中的“Windows”
negative lookahead 前向否定预查 (?!pattern) 正向查看是否不满足 Windows(?!95|98|NT|2000) “Windows3.1”中的“Windows” “Windows2000”中的“Windows”
negative lookbehind 后向肯定预查 (?<!pattern) 负向查看是否不满足 (?<!95|98|NT|2000)Windows “3.1Windows”中的“Windows” “2000Windows”中的“Windows”

 


工作中同事遇到问题,如下语句

 

没色差
没有色差
无色差
色差,有色差
色差太大,别的地方穿了才知道了
哈哈哈色差
色差

目标:匹配“色差”,但是不匹配"没色差"、“没有色差”、“无色差”中的“色差”,即不能是否定预期。

可以使用——零宽负向后行断言 即 (后向否定预查)

但是,如果多个断言条件在里面,应该长度一直,因为他们是同时消费字串的,由于“没”、“没有”、“无”长度不一致,因此增加任意字符".",使其一致。

错误的做法:

(?<!(没有|.没|.无))色差

虽然断言匹配不占用位置,但是后行检查时会向前检查两个字符,但是如果是行首,则不会检查。所以这种无法匹配到行首的“没色差”、“无色差”。

正则对这种事情好像我没找到解决方案,所以可以反向思考,考虑匹配到不需要的色差。

所以正确的做法:

(?:[没无]有?)色差

  

posted on 2018-06-14 18:20  蜗牛随笔  阅读(2925)  评论(1编辑  收藏  举报