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



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

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

我想找到任何";c";介于";A";以及";B";。所以在这个例子中,我需要得到3个匹配。

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

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

但它得到了A和B:c x c x c之间的所有刺痛。

如果我去掉.*部分,就不会有任何匹配。

我在这里举了一个例子。这样你就可以看到结果了。

这里有两种常见的情况:1(AB不同的单个字符串,2(AB是<em]不同的>多字符字符串。

场景1

您可以使用否定字符类:

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

请参阅此regex演示。详细信息:

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

场景2

如果AB是多字符字符串的占位符,例如ABCBCE,并且c是类似于cd+的某种模式(以匹配c及其后的一个或多个数字(,则使用

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

请参阅此regex演示。详细信息:

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

最新更新