Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式中的MatchCollection能否在C#中找到所有模式?_C#_Regex - Fatal编程技术网

正则表达式中的MatchCollection能否在C#中找到所有模式?

正则表达式中的MatchCollection能否在C#中找到所有模式?,c#,regex,C#,Regex,我用相应的示例编写了一个简单的正则表达式模式 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)

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

   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条记录

  • _如果(666)其他(777)(endif)_
  • _如果有其他情况_
  • _如果(如果)如果(如果)如果(如果)如果(如果)如果(如果)如果(如果)如果(如果)如果_
  • _如果111或222或333或444或555或666或777或_

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

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

  • \u if
    \u endif
  • 只把那些有
    \u else\u
    的东西放在里面

var s=@“\u if_111_else_222_if_if_333_else_444_endif_else_555_if_666_else_777_endif_endif_endif_endif_”;
var pat=@“(?x)(?=#重叠匹配捕获前瞻的开始
(_if_35;前导分隔符)
(?>#开始原子组(无回溯)
(?!(结束)?如果?)#任何不开始分隔符序列的符号
|(?_if_)#添加到堆栈o的前导分隔符
|(?_endif_35;添加到堆栈o的尾随分隔符
)*#重复原子组0+次
(?(o)(?!)#如果o堆栈不是空的,则使匹配失败
_尾随分隔符
)
)";
var res=Regex.Matches(s,pat)
.Cast()
.Select(p=>p.Groups[1]。值)
其中(n=>n.Contains(“\u else”))
.ToList();
foreach(在res中的var v)
控制台写入线(v);

您需要哪种形式的结果?你只是想要每个与正则表达式匹配的嵌套子字符串,还是想要构建某种树?@zneak,这确实是一个嵌套的if-so-if-find-correct应该返回4个匹配项,所以我不知道如何修改它以获得结果。我的意思是,你需要什么结果?只是子表达式的数量?每个子表达式字符串?因为每个匹配的字符串都不能告诉你它从哪里开始,这严重限制了你的能力,我不认为你可以用正则表达式来写。例如,在
\u if\u if\u 111\u else\u 222\u endif\u else\u 333\u endif
中,我不知道您将如何找到哪一个
else
与顶级
if
匹配,并且只有一个正则表达式。
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);