如何解决具有替代项的正则表达式捕获组不匹配
我有以下字符串,我想在其中匹配有效的 <key>:<value>
对。
有效的 <key>
是任何带有非空白字符后跟 :
一个有效的 <value>
要么包含在 []
中,要么是一个没有空格的字符串。
key1:value1 key#2:@value#2 nyet key3:[@value#3,value4] key4:[value5] :bar
基本上我想匹配除 nyet
和 :bar
之外的所有内容
我想出了以下正则表达式 \S+:(\S+|\[[^]]+\])
,但它似乎与 key3:[@value#3,value4]
中的表达式不匹配。在捕获组中,第二个选项 \[[^]]+\]
应该匹配这个表达式,所以我不明白为什么它不匹配。
以下正则表达式有效:\S+:([^([ )]+|\[[^\]]+\])
但感觉不优雅。
问题:
解决方法
在模式中,您可以 switch the alternatives \S+:(\[[^]]+\]|\S+)
但在这种情况下也将匹配 []
。
您还可以使用否定字符类来 exclude 匹配第一部分 :
中的 [^\s:]+:(\[[^]]+]|\S+)
。
对于组,您可以使用交替并检查值是否存在组 2 或组 3。
([^\s:]+):(?:\[([^][]+)]|(\S+))
模式匹配:
-
([^\s:]+)
捕获组 1,匹配除空白字符或:
之外的任何字符
-
:
匹配:
-
(?:
非捕获组-
\[([^][]+)]
匹配 group 2 中除[
和[
之外的任何字符的]
捕获并匹配结束]
立> -
|
或 -
(\S+)
在 group 3 中捕获 1+ 个非空白字符
-
-
)
关闭非捕获组
如果支持 conditional,您可以检查组 2 是否捕获了 [
。如果是这样,您可以捕获除第 3 组中的括号之外的任何字符。
您想要的值在第 1 组和第 3 组中。
([^\s:]+):(?:(\[)(?=[^][]*]))?((?(2)[^][]+|\S+))\]?
,
- 你对你的正则表达式很熟悉。它失败了,因为
:\S
的优先级高于:\[
- 这个正则表达式有效:
/\S+:(?:\[[^\]]*\]|\S+)/g
说明:
-
\S+:
- 1+ 个非空格字符和一个冒号 -
(?:
- 非捕获组开始(用于 OR)-
\[[^\]]*\]
-[...]
模式 -
|
- 逻辑 OR -
\S+
- 1+ 个非空格字符
-
-
)
- 非捕获组结束
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。