正则表达式中的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获取字符串中存在的所有模式?有更好的方法吗?
我建议将两步方法结合到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);