2014-02-05 85 views
2

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

回答

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 
+0

你是對的,的範圍界定的 「|」沒有如預期的那樣。我想相信這是因爲在學習正則表達式的DXL中它的實現方式不同,但回想起來,我越來越不確定。 (即我習慣於「xa | bz」匹配「xbz」而不匹配「xa」的實現。) – user3277168