【发布时间】:2021-05-28 19:47:39
【问题描述】:
我有以下字符串,我想在其中匹配有效的<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+:([^([ )]+|\[[^\]]+\]),但感觉不优雅。
问题:
- 为什么第一个正则表达式
\S+:(\S+|\[[^]]+\])不起作用? - 如何找到更优雅的解决方案来匹配键值对?
【问题讨论】:
-
([^\s:]+):(?|\[([^][]*)]|(\S+))可能适合您的场景,但它需要 PCRE/Boost。见demo。 -
您的第一个正则表达式不起作用,因为
\S+替代方案放在第一位。它总是“获胜”,因为[也是非空格。
标签: regex capturing-group