regex - 使用正则表达式查找两个字符串之间的多个匹配项
问题描述
想象一下我有一个这样的字符串:
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
作为一个结果。
如果我删除.*
零件,将根本没有匹配。
我在这里做了一个例子。所以你可以看到结果。
解决方案
这里有两种常见的情况:1) A
andB
是不同的单字符串,2) A
andB
是不同的多字符串。
方案 1
您可以使用否定字符类:
(?:\G(?!^)|A)[^AB]*?\Kc(?=[^AB]*B)
请参阅此正则表达式演示。细节:
(?:\G(?!^)|A)
-A
或上一场成功比赛的结束[^AB]*?
A
- 除and以外的任何零个或多个字符B
,尽可能少\K
- 匹配重置操作符,丢弃目前在整个内存匹配缓冲区中匹配的所有文本c
- 一个c
字符/字符串(?=[^AB]*B)
- 后面必须跟零个或多个字符,而不是A
andB
,然后B
是当前位置右侧的字符。
方案 2
如果A
andB
是多字符字符串的占位符,例如,ABC
andBCE
是c
某种模式,例如c\d+
(匹配c
后面的一个或多个数字)使用
(?s)(?:\G(?!^)|ABC)(?:(?!ABC).)*?\Kc\d+(?=.*?BCE)
请参阅此正则表达式演示。细节:
(?s)
- 使正则表达式引擎匹配任何字符的 DOTALL 修饰符.
(?:\G(?!^)|ABC)
-ABC
或上一场成功比赛的结束(?:(?!ABC).)*?
- 任何不启动ABC
字符序列的字符,0 次或更多次\K
- 匹配重置运算符c\d+
-c
和一位或多位数字(?=.*?BCE)
- 任何零个或多个字符,尽可能少,后跟BCE
.
推荐阅读
- mysql - MySQL - 从 GROUP BY 获取最大 ID 并保持性能
- python - 创建一个新列,为 Pandas DataFrame 中的重复值分配相同的索引
- reactjs - Unable to Ignore Block within React Class Components with istanbul ignore next to gain coverage
- visual-c++ - clang-cl 和 arch:avx2 是否存在兼容性问题?
- python - 3 类标签上的 LSTM 模型作为分类问题
- laravel - Laravel excel导出如何导出条件数据?
- agda - 为什么 Agda 会针对某些参数减少我的函数应用程序,而不会针对其他参数减少我的函数应用程序?
- django - Django Uploaded images not displayed in production
- javascript - File Upload by js
- java - How to refer a folder inside the jar