我想要一个正则表达式,它只能匹配多个中的一个术语。例如,给定字符串01010
,我想将0
与一个相邻的1
完全匹配。
我当前要使用的正则表达式为0(?=1)|(?<=1)0
,但是当我真的想排除0
(0 0 0
)中的所有 时,它匹配中间一个(0 0
),因为它有两个邻居,而不是一个。
这可能并不难,因为只需要检查两个术语,但是如果术语数量更大,则似乎会更困难。例如,如果我不仅要检查相邻的1
,还要要检查正好1
个字符的3
,该怎么办?
答案 0 :(得分:4)
如果0
后面跟着1
,则您的模式匹配,但没有限制,它只能是其中之一。您可以添加否定的Lookbehind和否定的Lookahead来实现。
尝试如下操作:
(?<!1)0(?=1)|(?<=1)0(?!1)
如果您想匹配0
有一个1
邻居还是一个1
(相距3个字符),事情会变得有些复杂,但是我们基本上遵循相同的规则。这样的事情会起作用:
(?<!1|1.{2})0(?=1|.{2}1)|(?<=1|.{2}1)0(?!1|.{2}1)
Demo 。
答案 1 :(得分:0)
以下正则表达式解决了这个问题。它与字符串中的每个字符匹配:1)后跟相同的字符,而不是前面的相同字符;或2)前跟相同的字符,而不后跟相同的字符。
^(.)(?=\1)|(?<=(.))(?=\2).$|(?<=(.))(?:(?=\3).(?!\3)|(?!\3)(.)(?=\4))
正则表达式引擎执行以下操作。
^ match beginning of line
(.) match first char and save to capture group 1
(?=\1) following char is the same char
| or
(?<=(.)) save the preceding char to capture group 2
(?=\2) char equals preceding char
. match char
$ match end of line
| or
(?<=(.)) save preceding char to capture group 3
(?: begin a non-capture group
(?=\3) char equals preceding char
. match char
(?!\3) following char is a different
| or
(?!\3) char does not equal preceding char
(.) save char in capture group 4
(?=\4) following char is the same
) end non-capture group