使用正则表达式查找两个字符串之间的多个匹配项
Using regex to find multiple matches between two strings
假设我有这样一个字符串:
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
作为一个结果。
如果我删除 .*
部分,将完全没有匹配项。
我做了一个example here。这样你就可以看到结果了。
这里有两种常见的情况:1)A
和B
是不同的单字符串,2)A
和B
是 不同的 多字符字符串。
场景一
你可以使用否定字符 类:
(?:\G(?!^)|A)[^AB]*?\Kc(?=[^AB]*B)
参见 this regex demo。详情:
(?:\G(?!^)|A)
- A
或上一次成功匹配结束
[^AB]*?
- 除了 A
和 B
之外的任何零个或多个字符,尽可能少
\K
- 匹配重置运算符,丢弃整个内存匹配缓冲区中到目前为止匹配的所有文本
c
- 一个c
char/string
(?=[^AB]*B)
- 除了 A
和 B
之外,必须后跟零个或多个字符,然后 B
字符紧跟在当前位置的右侧。
场景二
如果 A
和 B
是多字符字符串的占位符,例如 ABC
和 BCE
并且 c
是某种模式,例如 c\d+
(匹配 c
和它后面的一位或多位数字)使用
(?s)(?:\G(?!^)|ABC)(?:(?!ABC).)*?\Kc\d+(?=.*?BCE)
参见 this regex demo。详情:
(?s)
- 一个 DOTALL 修饰符,使正则表达式引擎匹配任何具有 .
的字符
(?:\G(?!^)|ABC)
- ABC
或上一次成功匹配结束
(?:(?!ABC).)*?
- 任何字符,0 次或多次,不启动 ABC
字符序列
\K
- 匹配重置运算符
c\d+
- c
和一位或多位数字
(?=.*?BCE)
- 任何零个或多个字符,尽可能少,后跟 BCE
.
假设我有这样一个字符串:
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
作为一个结果。
如果我删除 .*
部分,将完全没有匹配项。
我做了一个example here。这样你就可以看到结果了。
这里有两种常见的情况:1)A
和B
是不同的单字符串,2)A
和B
是 不同的 多字符字符串。
场景一
你可以使用否定字符 类:
(?:\G(?!^)|A)[^AB]*?\Kc(?=[^AB]*B)
参见 this regex demo。详情:
(?:\G(?!^)|A)
-A
或上一次成功匹配结束[^AB]*?
- 除了A
和B
之外的任何零个或多个字符,尽可能少\K
- 匹配重置运算符,丢弃整个内存匹配缓冲区中到目前为止匹配的所有文本c
- 一个c
char/string(?=[^AB]*B)
- 除了A
和B
之外,必须后跟零个或多个字符,然后B
字符紧跟在当前位置的右侧。
场景二
如果 A
和 B
是多字符字符串的占位符,例如 ABC
和 BCE
并且 c
是某种模式,例如 c\d+
(匹配 c
和它后面的一位或多位数字)使用
(?s)(?:\G(?!^)|ABC)(?:(?!ABC).)*?\Kc\d+(?=.*?BCE)
参见 this regex demo。详情:
(?s)
- 一个 DOTALL 修饰符,使正则表达式引擎匹配任何具有.
的字符
(?:\G(?!^)|ABC)
-ABC
或上一次成功匹配结束(?:(?!ABC).)*?
- 任何字符,0 次或多次,不启动ABC
字符序列\K
- 匹配重置运算符c\d+
-c
和一位或多位数字(?=.*?BCE)
- 任何零个或多个字符,尽可能少,后跟BCE
.