使用正则表达式查找两个字符串之间的多个匹配项
想象一下,我有一个这样的字符串:
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)A和B是不同的单字符串,2)A和B是不同的多字符字符串。
场景一
您可以使用否定字符类:
(?:G(?!^)|A)[^AB]*?Kc(?=[^AB]*B)
请参阅此正则表达式演示。细节:
(?:G(?!^)|A)-A或上一场成功的比赛结束[^AB]*?- 除Aand之外的任何零个或多个字符B,尽可能少K- 匹配重置操作符,丢弃目前在整个内存匹配缓冲区中匹配的所有文本c- 一个c字符/字符串(?=[^AB]*B)-必须遵循比其他零个或多个字符A和B再B焦炭立即到当前位置的右侧。
场景二
如果A和B是占位符multichar字符串,也就是说,ABC和BCE而c像一些模式cd+(以匹配c和之后的一个或多个数字)使用
(?s)(?:G(?!^)|ABC)(?:(?!ABC).)*?Kcd+(?=.*?BCE)
请参阅此正则表达式演示。细节:
(?s)- 使正则表达式引擎匹配任何字符的 DOTALL 修饰符.(?:G(?!^)|ABC)-ABC或上一场成功的比赛结束(?:(?!ABC).)*?- 任何字符,0 次或多次,不开始ABC字符序列K- 匹配重置运算符cd+-c和一位或多位数字(?=.*?BCE)- 任何零个或多个字符,尽可能少,后跟BCE.