正则表达式——非捕获匹配
正则中有一类,在匹配时不消费掉匹配的字符,这种是断言检测。但注意的是,
英文名称 | 名称 | 正则 | 含义 | 举例 | 匹配到 | 不匹配 |
断言检测 | 非捕获匹配 | (?: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” |
工作中同事遇到问题,如下语句
没色差
没有色差
无色差
色差,有色差
色差太大,别的地方穿了才知道了
哈哈哈色差
色差
目标:匹配“色差”,但是不匹配"没色差"、“没有色差”、“无色差”中的“色差”,即不能是否定预期。
可以使用——零宽负向后行断言 即 (后向否定预查)
但是,如果多个断言条件在里面,应该长度一直,因为他们是同时消费字串的,由于“没”、“没有”、“无”长度不一致,因此增加任意字符".",使其一致。
错误的做法:
(?<!(没有|.没|.无))色差
虽然断言匹配不占用位置,但是后行检查时会向前检查两个字符,但是如果是行首,则不会检查。所以这种无法匹配到行首的“没色差”、“无色差”。
正则对这种事情好像我没找到解决方案,所以可以反向思考,考虑匹配到不需要的色差。
所以正确的做法:
(?:[没无]有?)色差