如何在正向反向预查区间内捕获所有指定字符的匹配项?
问题
需要捕获满足以下条件的所有-字符:
- 位于以
[abc!开头、以]结尾的字符串片段内 - 忽略不在该片段内的
-
示例文本:
- [abc!word1-word2-word3] - word1-word2-word3
尝试过的正则(PCRE2、gm模式):
(?<=\[abc!).*(-).*(?=\])
但该正则仅能匹配到目标片段里的最后一个-,无法捕获全部。
解决方案
方法1:使用前后断言精准定位每个目标-
使用如下正则(启用gm模式):
(?<=\[abc![^\]]*)-(?=[^\]]*\])
- 正向后顾断言
(?<=\[abc![^\]]*):确保当前位置之前是[abc!,且中间没有出现],避免跨区间匹配 - 正向前瞻断言
(?=[^\]]*\]):确保当前位置之后存在],且中间没有出现] - 这样每个处于
[abc!和]之间的-都会被单独匹配捕获。
方法2:先匹配目标片段再提取所有-
如果允许分两步处理,效率和可读性会更高:
- 先用正则匹配整个目标片段并捕获内部内容:
此正则会捕获\[abc!([^\]]*)\][abc!和]之间的所有内容到捕获组1中(示例中为word1-word2-word3) - 对捕获组1的内容,直接提取所有
-字符即可(无需复杂正则,简单遍历或用/-/g匹配即可)
原正则失效原因
原正则(?<=\[abc!).*(-).*(?=\])中,.*是贪婪匹配模式,会尽可能匹配多的字符,导致前面的-都被.*覆盖,仅最后一个-会被捕获到分组中。
内容的提问来源于stack exchange,提问作者Mihai Constantin
相关产品推荐
相关产品推荐

