.NET中的正则表达式:加入重复的命名捕获组

.NET中的正则表达式:加入重复的命名捕获组,.net,regex,.net,Regex,给定表达式^a.*c和测试字符串abc,预期命名组res将concat找到的值和get ac,但得到了最新的更改-c C的正则表达式类有没有办法支持正则表达式中命名组的concat 相关的问题是,它说Perl/PCRE不支持重复的命名对,但这里我得到了.NET,并寻找它的特殊魔力,使正则表达式返回一个单一匹配,其中包含字符串不同部分的两个找到的值,也就是说,abbbbcdef应该返回ac 多次调用regex或在代码中加入结果组现在不是一个可以容忍的解决方案——希望在regex中完成全部工作 va

给定表达式^a.*c和测试字符串abc,预期命名组res将concat找到的值和get ac,但得到了最新的更改-c

C的正则表达式类有没有办法支持正则表达式中命名组的concat

相关的问题是,它说Perl/PCRE不支持重复的命名对,但这里我得到了.NET,并寻找它的特殊魔力,使正则表达式返回一个单一匹配,其中包含字符串不同部分的两个找到的值,也就是说,abbbbcdef应该返回ac

多次调用regex或在代码中加入结果组现在不是一个可以容忍的解决方案——希望在regex中完成全部工作

var match = re.Match(s);
var captures = match.Groups["res"].Captures.Cast<Capture>().Select(c => c.Value);
var result = string.Concat(captures);

强制转换是必要的,因为捕获返回的集合没有实现IEnumerable。

非唯一组名的目的只是为了在捕获字符串的部分时提供更大的灵活性。在正则表达式与Replace方法匹配后,您通常会使用不同的方法获取捕获的部分并重新组装它们:

输出:

ac

这个问题让我想起了我见过的其他人,他们希望正则表达式跳过他们不感兴趣的字符串部分,也就是说,使用一些部分,但不使用其他部分。在我熟悉的任何正则表达式风格中都无法做到这一点。

当前的解决方案是为每个条件按升序分配组名:?|

匹配后,所有找到的组都被放入列表并按其名称排序,根据匹配的条件从group0、group1或group0生成最终查询字符串

另一个技巧是需要从头开始匹配:

^?废气排放条件变化1 |变化2

ac