正则表达式中的MatchCollection可以在C#中找到所有模式吗

本文关键字:模式 MatchCollection 正则表达式 | 更新日期: 2023-09-27 17:58:13

我写了一个简单的正则表达式模式和相应的示例

   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 ?!?!?

匹配变量的结果只返回1条记录,而我希望它返回4条记录。

  • _if_666_else_777_endif_
  • _if_333_else_444_endif_
  • _如果__if_333_else_444_endif_else_555_if_666_else_777_endif_endif_endif_
  • _如果_111_else_222_if_if_333_else_444_endif_else_555_if_666_else_777_endif_endif_

如何通过regex获取字符串中存在的所有模式?有更好的方法吗?

正则表达式中的MatchCollection可以在C#中找到所有模式吗

我建议将两步方法结合到Regex+Linq中。

  • 获取从_if__endif_的所有平衡子串
  • 只保留里面有_else_

查看IDEONE演示

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);