想象一下我有一个这样的字符串:
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(A
和B
是不同的单个字符串,2(A
和B
是<em]不同的>多字符字符串。
场景1
您可以使用否定字符类:
(?:G(?!^)|A)[^AB]*?Kc(?=[^AB]*B)
请参阅此regex演示。详细信息:
(?:G(?!^)|A)
-A
或上一次成功匹配结束[^AB]*?
-除A
和B
之外的任何零个或多个字符,尽可能少K
-匹配重置运算符,用于丢弃整个内存匹配缓冲区中迄今为止匹配的所有文本c
-c
字符/字符串(?=[^AB]*B)
-后面必须紧跟零个或多个字符,而不是A
和B
,然后紧跟在当前位置右侧的B
字符
场景2
如果A
和B
是多字符字符串的占位符,例如ABC
和BCE
,并且c
是类似于cd+
的某种模式(以匹配c
及其后的一个或多个数字(,则使用
(?s)(?:G(?!^)|ABC)(?:(?!ABC).)*?Kcd+(?=.*?BCE)
请参阅此regex演示。详细信息:
(?s)
-一个DOTALL修饰符,使正则表达式引擎将任何字符与.
匹配(?:G(?!^)|ABC)
-ABC
或上一次成功匹配结束(?:(?!ABC).)*?
-不启动ABC
字符序列的任何字符,0次或更多次K
-匹配重置操作员cd+
-c
和一个或多个数字(?=.*?BCE)
-任何零个或多个字符,尽可能少,后面跟BCE