gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:37:09 26 4
gpt4 key购买 nike

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

   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__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_

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

最佳答案

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

  • 获取从_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);

关于c# - 正则表达式中的 MatchCollection 能否找到 C# 中的所有模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38519151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com