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

想象一下,我有一个这样的字符串:

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作为一个结果。

如果我移除.*零件,将根本没有匹配项。

我在这里做了一个例子。所以你可以看到结果。

回答

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

场景一

您可以使用否定字符类:

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

请参阅此正则表达式演示。细节:

  • (?:G(?!^)|A)-A或上一场成功的比赛结束
  • [^AB]*?- 除Aand之外的任何零个或多个字符B,尽可能少
  • K - 匹配重置操作符,丢弃目前在整个内存匹配缓冲区中匹配的所有文本
  • c- 一个c字符/字符串
  • (?=[^AB]*B) -必须遵循比其他零个或多个字符ABB焦炭立即到当前位置的右侧。

场景二

如果AB是占位符multichar字符串,也就是说,ABCBCEc像一些模式cd+(以匹配c和之后的一个或多个数字)使用

(?s)(?:G(?!^)|ABC)(?:(?!ABC).)*?Kcd+(?=.*?BCE)

请参阅此正则表达式演示。细节:

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

以上是使用正则表达式查找两个字符串之间的多个匹配项的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>