编写匹配除指定序列外内容的正则表达式遇到的问题
解决正则匹配除指定序列外内容的问题
你的问题出在原正则((?!patt).)+的逻辑上:它只会排除刚好从当前字符开始是"patt"的那个首字符,而不会跳过整个"patt"序列。比如在"pattern"里,第一个"p"后面刚好是"att"凑成"patt",所以这个"p"被排除,但后面的"a""t""t"因为从它们的位置开始不是"patt",所以会被保留,导致你得到"attern"而不是期望的"ern"。
给你两个可行的方案:
方案1:用替换(最简单直接)
不需要复杂的匹配正则,直接把所有出现的"patt"替换为空字符串就行。比如在支持正则替换的工具里,匹配模式写patt,替换为"",就能把所有"patt"序列删掉,得到"ern noster ern"。
方案2:用匹配模式(如果一定要用匹配获取结果)
使用这个正则:(?:patt(*SKIP)(*FAIL)|.)+
- 逻辑是:先匹配到"patt",然后用
(*SKIP)(*FAIL)标记这部分为无效,直接跳过; - 对于其他所有字符,正常匹配。
这样最终匹配到的内容就是除了"patt"之外的所有部分。
测试你的输入"pattern noster pattern",用这个正则就能得到期望的"ern noster ern"。
内容的提问来源于stack exchange,提问作者plpl
相关产品推荐
相关产品推荐

