正则表达式捕获了与正则表达式成功不一致的组

时间:2014-02-05 22:05:40

标签: c# regex

我在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]"

1 个答案:

答案 0 :(得分:0)

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

    # 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

也许你只需要移动锚点^ $和括号之外 "^\\[(?:((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?))\\]$"

 ^                             # 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