精确匹配一个正则表达式项

时间:2020-05-11 22:57:25

标签: regex

我想要一个正则表达式,它只能匹配多个中的一个术语。例如,给定字符串01010,我想将0与一个相邻的1完全匹配。

我当前要使用的正则表达式为0(?=1)|(?<=1)0,但是当我真的想排除00 0 0)中的所有 时,它匹配中间一个(0 0),因为它有两个邻居,而不是一个。

这可能并不难,因为只需要检查两个术语,但是如果术语数量更大,则似乎会更困难。例如,如果我不仅要检查相邻的1,还要要检查正好1个字符的3,该怎么办?

2 个答案:

答案 0 :(得分:4)

如果0后面跟着1,则您的模式匹配,但没有限制,它只能是其中之一。您可以添加否定的Lookbehind和否定的Lookahead来实现。

尝试如下操作:

(?<!1)0(?=1)|(?<=1)0(?!1)

Demo


编辑

如果您想匹配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))

Demo

正则表达式引擎执行以下操作。

^          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