C# Regex捕获的组与Regex成功不一致

C# Regex捕获的组与Regex成功不一致,c#,regex,C#,Regex,我在C#中使用了下面的正则表达式,虽然它几乎完全按照预期报告了成功和失败,但考虑到比赛是成功的,捕获组的实际内容似乎是不可能的。对于同一个正则表达式,我有两个不同的例子,我不确定它们是否相关 Regex specialHandlerPattern = new Regex("^\\[((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?)\\]$"); Match m = specialHandlerPattern.Match("[Regex:^Aardvark

我在C#中使用了下面的正则表达式,虽然它几乎完全按照预期报告了成功和失败,但考虑到比赛是成功的,捕获组的实际内容似乎是不可能的。对于同一个正则表达式,我有两个不同的例子,我不确定它们是否相关

Regex specialHandlerPattern = new Regex("^\\[((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?)\\]$");
Match m = specialHandlerPattern.Match("[Regex:^Aardvark_[0-2]:[0-9]+]");    
//Match m = specialHandlerPattern.Match("[InclusiveTolerance:0.123:0.457]");

if (m.Success) {
    Console.WriteLine("Success!");
    int i = 0;
    foreach( Group g in m.Groups) {
    Console.WriteLine("\n\tGroup {0} = \"{1}\"", i++, g);
}
在第一种情况下,比赛如预期的那样成功。然而,第1组和第3组的内容不正确。。。它们都包括在这些组之外指定的端子“]”:

Success!

    Group 0 = "[Regex:^Aardvark_[0-2]:[0-9]+]"

    Group 1 = "Regex:^Aardvark_[0-2]:[0-9]+]"

    Group 2 = "Regex"

    Group 3 = "^Aardvark_[0-2]:[0-9]+]"

    Group 4 = ""

    Group 5 = ""

    Group 6 = ""

    Group 7 = ""

    Group 8 = ""
在第二种情况下(切换注释行),匹配也会如预期的那样成功。但是,组0的内容不正确。。。缺少前导“[”:

Success!

    Group 0 = "InclusiveTolerance:0.123:0.457]"

    Group 1 = ""

    Group 2 = ""

    Group 3 = ""

    Group 4 = "InclusiveTolerance:0.123:0.457"

    Group 5 = "InclusiveTolerance"

    Group 6 = "0.123"

    Group 7 = ":0.457"

    Group 8 = "0.457"    
我不明白这些匹配如何能够成功并仍然产生这些组-特别是在第一种情况下,似乎在这些组中包含额外的“]”会导致正则表达式匹配失败,然后返回。C#正则表达式有什么我根本不知道的特性吗

编辑: 也许是一个有说服力的细节? 以下字符串将(与我的意图相反)成功匹配:

"[Regex:^Aardvark_[0-2]:[0-9]+"
"InclusiveTolerance:0.123:0.457]"

也许这将帮助您诊断问题。
这是您的正则表达式,已格式化并已展开。
只是一个建议-尝试像这样的正则表达式格式化应用程序。
这将允许您从格式化位置编辑和测试,然后压缩它以用于生产

    # DO THIS
    ^                             # Beginning of string
    \[
    (                             # (1 start)
         ( Regex )                     # (2)
         :
         ( .+ )                        # (3)
    )                             # (1 end)
 |  
    # OR,
    (                             # (4 start)
         ( \w+ )                       # (5)
         :
         ( [^:]+ )                     # (6)
         (                             # (7 start)
              :
              ( [0-9\.]+ )                  # (8)
         )?                            # (7 end)
    )                             # (4 end)
    \]
    $                             # End of string
也许您只需将锚定^$和括号移到外部
“^\[(?:((正则表达式):(.+)|((\\w+):([^::+)(:([0-9\.]+)?)\\]$”


您是对的,“|”的范围并没有达到预期的效果。我愿意相信这是因为我在DXL学习regex时,它的实现方式不同,但回想起来,我变得不太确定了。(也就是说,我习惯于“xa | bz”与“xbz”匹配但与“xa”不匹配的实现。)
 ^                             # Beginning of string
 \[
 (?:
      # DO THIS
      (                             # (1 start)
           ( Regex )                     # (2)
           :
           ( .+ )                        # (3)
      )                             # (1 end)
   |  
      # OR,
      (                             # (4 start)
           ( \w+ )                       # (5)
           :
           ( [^:]+ )                     # (6)
           (                             # (7 start)
                :
                ( [0-9\.]+ )                  # (8)
           )?                            # (7 end)
      )                             # (4 end)
 )
 \]
 $                             # End of string