首页 > 解决方案 > 使用正则表达式查找两个字符串之间的多个匹配项

问题描述

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

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

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

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

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

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

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

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

标签: regexpcrebetween

解决方案


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

方案 1

您可以使用否定字符类:

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

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

  • (?:\G(?!^)|A)-A或上一场成功比赛的结束
  • [^AB]*?A- 除and以外的任何零个或多个字符B,尽可能少
  • \K- 匹配重置操作符,丢弃目前在整个内存匹配缓冲区中匹配的所有文本
  • c- 一个c字符/字符串
  • (?=[^AB]*B) - 后面必须跟零个或多个字符,而不是Aand B,然后B是当前位置右侧的字符。

方案 2

如果AandB是多字符字符串的占位符,例如,ABCandBCEc某种模式,例如c\d+(匹配c后面的一个或多个数字)使用

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

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

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

推荐阅读