正则表达式中的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);