2016-07-22 52 views
3

我寫了一個簡單的正則表達式模式與相應的樣本正則表達式中的MatchCollection可以找到C#中的所有模式嗎?

var regex = @"_if_.*_else_.*_endif_"; 

    // 4 nested regex pattern 
    var sample = @"_if_111_else_222_if__if_333_else_444_endif__else_555_if_666_else_777_endif__endif__endif_"; 

    var matches = Regex.Matches(sample, regex); // count : 1 ?!?!? 

結果匹配的變量,而我希望它返回4條記錄返回只有1個記錄。

  • _if_666_else_777_endif_
  • _if_333_else_444_endif_
  • _if__if_333_else_444_endif__else_555_if_666_else_777_endif__endif__endif_
  • _if_111_else_222_if__if_333_else_444_endif__else_555_if_666_else_777_endif__endif__endif_

我怎麼能得到通過正則表達式在字符串中存在的所有模式?有沒有更好的辦法?

+0

以何種形式,你需要的結果?你只是想要每個與正則表達式匹配的嵌套子字符串,還是你想構建某種樹? – zneak

+0

@zneak,這是一個嵌套如果是這樣,如果找到正確的應該返回4個匹配,所以我不知道如何修改它的增益結果 – user6609534

+0

我的意思是,你需要什麼結果?只是子表達的數量?每個子表達式字符串?因爲每個匹配的字符串都不會告訴你從哪開始,這嚴重限制了你做事的能力。 – zneak

回答

1

我建議組合成一個正則表達式+ Linq的2步法。

  • 獲取來自_if_所有平衡子,直到_endif_
  • 只保留那些有_else_內。

IDEONE demo

var s = @"_if_111_else_222_if__if_333_else_444_endif__else_555_if_666_else_777_endif__endif__endif_"; 
var pat = @"(?x)(?=  # Start of the overlapping match capturing lookahead 
     (_if_     # Leading delimiter 
      (?>     # Start of atomic group (no backtracking into it) 
      (?!_(?:end)?if_). # Any symbol not starting the delimiter sequence 
      |(?<o>_if_)   # A leading delimiter added to stack o 
      |(?<-o>_endif_)  # Trailing delimiter added to stack o 
     )*     # Repeat the atomic group 0+ times 
      (?(o)(?!))   # If the o stack is not empty, fail the match 
     _endif_    # Trailing delimiter 
     ) 
     )"; 
var res = Regex.Matches(s, pat) 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .Where(n => n.Contains("_else_")) 
     .ToList(); 
foreach (var v in res) 
    Console.WriteLine(v); 
相關問題