具有替代项的正则表达式捕获组不匹配



我有以下字符串,我想匹配有效的<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+:([^([ )]+|[[^]]+]),但是感觉不太优雅。

问题:

  1. 为什么第一个正则表达式S+:(S+|[[^]]+])不工作?
  2. 一个更优雅的解决方案如何匹配键值对?

在模式中,您可以切换S+:([[^]]+]|S+),但在这种情况下,它也将匹配[]

您还可以使用否定的字符类排除第一部分[^s:]+:([[^]]+]|S+)中的:匹配。

对于组,您可以使用替代并检查值是否存在组2或组3。

([^s:]+):(?:[([^][]+)]|(S+))

模式匹配:

  • ([^s:]+)Capture组1,匹配任何字符,除了空白字符或:
  • :匹配:
  • (?:非捕获组
    • [([^][]+)]匹配组2中[的捕获[]之外的任何字符,并匹配关闭的]
    • |
    • (S+)捕获第3组中的1+非空白字符
  • )关闭非捕获组

Regex演示


如果支持条件,则可以检查组2是否捕获了[。如果是,则可以捕获除第3组中的括号以外的任何字符。

你想要的值在第1组和第3组。

([^s:]+):(?:([)(?=[^][]*]))?((?(2)[^][]+|S+))]?

Regex演示

  1. 你的正则表达式很接近。失败是因为:S优先于:[
/S+:(?:[[^]]*]|S+)/g

解释:

  • S+:- 1+非空格字符和冒号
  • (?:-非捕获组启动(for OR)
    • [[^]]*]-[...]图案
    • |-逻辑或
    • S+- 1+非空格字符
  • )-非捕获组结束

最新更新