我有以下字符串,我想匹配有效的<key>:<value>
对。
一个有效的<key>
是任何一个非空白字符后面跟着:
一个有效的<value>
要么包含在[]
中,要么是一个没有空白的字符串。
key1:value1 key#2:@value#2 nyet key3:[@value#3, value4] key4:[value5] :bar
基本上我想匹配除了nyet
和:bar
以外的所有内容
我想出了以下regexS+:(S+|[[^]]+])
,但它似乎不匹配key3:[@value#3, value4]
中的表达式。在捕获组中,第二个备选[[^]]+]
应该匹配这个表达式,所以我不明白为什么它不匹配。
下面的regex可以工作:S+:([^([ )]+|[[^]]+])
,但是感觉不太优雅。
问题:
- 为什么第一个正则表达式
S+:(S+|[[^]]+])
不工作? - 一个更优雅的解决方案如何匹配键值对?
在模式中,您可以切换S+:([[^]]+]|S+)
,但在这种情况下,它也将匹配[]
。
您还可以使用否定的字符类排除第一部分[^s:]+:([[^]]+]|S+)
中的:
匹配。
对于组,您可以使用替代并检查值是否存在组2或组3。
([^s:]+):(?:[([^][]+)]|(S+))
模式匹配:
([^s:]+)
Capture组1,匹配任何字符,除了空白字符或:
:
匹配:
(?:
非捕获组[([^][]+)]
匹配组2中[
的捕获除[
和]
之外的任何字符,并匹配关闭的]
|
或(S+)
捕获第3组中的1+非空白字符
)
关闭非捕获组
Regex演示
如果支持条件,则可以检查组2是否捕获了[
。如果是,则可以捕获除第3组中的括号以外的任何字符。
你想要的值在第1组和第3组。
([^s:]+):(?:([)(?=[^][]*]))?((?(2)[^][]+|S+))]?
Regex演示
- 你的正则表达式很接近。失败是因为
:S
优先于:[
/S+:(?:[[^]]*]|S+)/g
解释:
S+:
- 1+非空格字符和冒号(?:
-非捕获组启动(for OR)[[^]]*]
-[...]
图案|
-逻辑或S+
- 1+非空格字符
)
-非捕获组结束