我想学习如何捕获(?<=...)
和(?=...)
之间出现的所有字符(例如,-
)。
假设我有以下文本:
- [abc!word1-word2-word3]
- word1-word2-word3
我的目标是创建一个包含所有-
的捕获组,只有当字符串以[abc!
开头并以]
结尾时才能创建。
我使用gm
选项和PCRE2
风格尝试了以下操作(例如,参见demo here):
(?<=\[abc!).*(-).*(?=\])
但是,只有最后一次出现的-
匹配,如下所示。
有没有办法做到这一点?
2条答案
按热度按时间xienkqul1#
您可以使用以下命令替换
[abc!
和下一个(最接近的)]
字符之间的每个连字符参见regex demo。
(?:\G(?!\A)|\[abc!)
-上一个成功匹配的结束(\G(?!\A)
,参见this\G
reference)或(|
)[abc!
字符串(\[abc!
)[^][-]*
-除[
、]
和-
之外的零个或多个字符\K
-一个match reset operator,它从匹配内存缓冲区中丢弃到目前为止匹配的文本-
-连字符(?=[^][]*])
-一个positive lookahead,确保在当前位置的右边有零个或多个字符,而不是方括号后面紧跟一个]
字符。vwkv1x7d2#
如果您使用的正则表达式引擎不支持
\G
,只要满足某些条件,以下是实现目标的几种方法。用例1:您的正则表达式引擎支持变长正向查找(例如C#的引擎)
你可以用
Demo
这个正则表达式可以分解如下。
情况2:已知字符串中的每个右括号前面都有
'[abc!'
,中间没有右括号Demo
请注意,这个正则表达式与前面的正则表达式相同,只是去掉了正向后看。