使用正则表达式查找两个字符串之间的多个匹配项

Using regex to find multiple matches between two strings

假设我有这样一个字符串:

c x c x A c x c x c B c x c x

我想找到“A”和“B”之间的任何“c”字符。所以在这个例子中我需要得到 3 个匹配项。

我知道我可以使用先行和后行标记。所以我使用了这个正则表达式:

(?<=A).*c.*(?=B)

但它得到了 A 和 B 之间的所有刺痛:c x c x c 作为一个结果。

如果我删除 .* 部分,将完全没有匹配项。

我做了一个example here。这样你就可以看到结果了。

这里有两种常见的情况:1)AB不同的单字符串,2)AB 不同的 多字符字符串。

场景一

你可以使用否定字符 类:

(?:\G(?!^)|A)[^AB]*?\Kc(?=[^AB]*B)

参见 this regex demo。详情:

  • (?:\G(?!^)|A) - A 或上一次成功匹配结束
  • [^AB]*? - 除了 AB 之外的任何零个或多个字符,尽可能少
  • \K - 匹配重置运算符,丢弃整个内存匹配缓冲区中到目前为止匹配的所有文本
  • c - 一个c char/string
  • (?=[^AB]*B) - 除了 AB 之外,必须后跟零个或多个字符,然后 B 字符紧跟在当前位置的右侧。

场景二

如果 AB 是多字符字符串的占位符,例如 ABCBCE 并且 c 是某种模式,例如 c\d+ (匹配 c 和它后面的一位或多位数字)使用

(?s)(?:\G(?!^)|ABC)(?:(?!ABC).)*?\Kc\d+(?=.*?BCE)

参见 this regex demo。详情:

  • (?s) - 一个 DOTALL 修饰符,使正则表达式引擎匹配任何具有 .
  • 的字符
  • (?:\G(?!^)|ABC) - ABC 或上一次成功匹配结束
  • (?:(?!ABC).)*? - 任何字符,0 次或多次,不启动 ABC 字符序列
  • \K - 匹配重置运算符
  • c\d+ - c 和一位或多位数字
  • (?=.*?BCE) - 任何零个或多个字符,尽可能少,后跟 BCE.