Regex 正则表达式捕获组,具有可选属性';不匹配

Regex 正则表达式捕获组,具有可选属性';不匹配,regex,capturing-group,Regex,Capturing Group,我想在下面的字符串中匹配有效的:对 有效的是任何后跟:的非空白字符 有效的可以包含在[]中,也可以是不带空格的字符串 key1:value1键#2:@value#2 nyet键3:[@value#3,value4]key4:[value5]:条 基本上,我想匹配所有东西,除了nyet和:bar 我提出了以下正则表达式\S+:(\S+\[^]+\]),但它似乎与key3:[@value\35; 3,value4]中的表达式不匹配。在捕获组中,第二个可选的\[[^]]+\]应该匹配这个表达式,所以

我想在下面的字符串中匹配有效的

有效的
是任何后跟

的非空白字符 有效的
可以包含在
[]
中,也可以是不带空格的字符串

key1:value1键#2:@value#2 nyet键3:[@value#3,value4]key4:[value5]:条
基本上,我想匹配所有东西,除了
nyet
:bar

我提出了以下正则表达式
\S+:(\S+\[^]+\])
,但它似乎与
key3:[@value\35; 3,value4]
中的表达式不匹配。在捕获组中,第二个可选的
\[[^]]+\]
应该匹配这个表达式,所以我不理解为什么它不匹配

下面的正则表达式可以工作:
\S+:([^([)]+\[^\]]+\])
,但感觉不优雅

问题:

  • 为什么第一个正则表达式
    \S+:(\S+\[[^]]+\])
    不起作用
  • 一个更优雅的解决方案如何匹配键值对
  • 在模式中,您可以
    \S+:(\[[^]]+\]\124;\ S+
    ,但在这种情况下,is也将与
    []
    匹配

    您还可以使用否定字符类来匹配第一部分中的
    (\[[^]]+]\s+

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

    ([^\s:]+):(?:\[([^][]+)]|(\S+))
    
    模式匹配:

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


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

    然后,所需的值位于组1和组3中

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

    在模式中,您可以
    \S+:(\[[^]+\]\S+
    ,但在这种情况下,is也将与
    []
    匹配

    您还可以使用否定字符类来匹配第一部分中的
    (\[[^]]+]\s+

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

    ([^\s:]+):(?:\[([^][]+)]|(\S+))
    
    模式匹配:

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


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

    然后,所需的值位于组1和组3中

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

  • 您的正则表达式很接近。它失败了,因为
    :\S
    的优先级高于
    :\[
  • 该正则表达式适用于:
  • 说明:

    • \S+:
      -1+非空格字符和冒号
    • (?:
      -非捕获组启动(用于或)
      • \[^\]*\]
        -
        […]
        模式
      • |
        -逻辑或
      • \S+
        -1+非空格字符
    • -非捕获组结束
  • 您的正则表达式很接近。它失败了,因为
    :\S
    的优先级高于
    :\[
  • 该正则表达式适用于:
  • 说明:

    • \S+:
      -1+非空格字符和冒号
    • (?:
      -非捕获组启动(用于或)
      • \[^\]*\]
        -
        […]
        模式
      • |
        -逻辑或
      • \S+
        -1+非空格字符
    • -非捕获组结束

    可能,
    ([^\s:]+):(?\[([^][*])(\s+)
    会适合您的场景,但它需要PCRE/Boost。请参见。您的第一个正则表达式不起作用,因为将
    \s+
    替代项放在第一位。它总是“赢”,因为
    [
    也是非空白。可能,
    ([^\s:]+):(?\[^\s:]+]):(?\[^-[^]]*]):(([^-[-[]]]*])。\s+)
    将适合您的场景,但需要PCRE/Boost。请参阅。您的第一个正则表达式不起作用,因为将
    \S+
    备选方案放在第一位。自
    [
    也是非空白。@Frode Akselsen:这符合你的需要吗?有问题吗?没有,非常感谢你的帮助!@Frode Akselsen:这符合你的需要吗?有问题吗?没有,非常感谢你的帮助!