.NET中的Regex:加入重复的命名捕获组

时间:2011-09-01 16:48:00

标签: .net regex

给定表达式^(?<res>a).*(?<res>c)和测试字符串abc,期望命名组res连接两个找到的值并得到ac,但获得最新更改 - {{1} }。

C#的正则表达式类是否支持regex中命名组的concat?

相关的问题是Regex issue with named captured pairs,并且有可能它说Perl / PCRE不支持重复的命名对,但是在这里我得到了.NET,并且寻找它的特殊魔法使正则表达式返回单个匹配,包含来自字符串不同部分的两个找到的值(即,abbbbbcdef应该返回ac)。

不止一次调用正则表达式或在代码中加入结果组现在不是一个容忍得很好的解决方案 - 希望在正则表达式中完成整个工作。

3 个答案:

答案 0 :(得分:4)

非唯一组名的目的仅仅是为了捕获字符串的一部分提供更大的灵活性。获取捕获的部分并以不同的方式重新组合它是在正则表达式匹配后通常使用Replace方法执行的操作:

string s0 = @"abbbbbcdef";
string s1 = Regex.Replace(s0, @"^.*(a).*(c).*$", "$1$2");
Console.WriteLine(s1);

输出:

ac

这个问题让我想起了其他人,我已经看到人们希望正则表达式“跳过”他们不感兴趣的字符串的部分 - 也就是说,消耗一些部分而不是其他部分。在我熟悉的任何正则表达式中都无法做到这一点。

答案 1 :(得分:3)

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

Cast()是必要的,因为Captures返回的集合未实现IEnumerable<T>

答案 2 :(得分:-1)

目前的解决方案是为每个条件按升序分配组名:((?<group0>))|((?<group1>)(?<group0>))

匹配后,所有找到的组都会列出并按名称排序,从group0,group1group0构建最终查询字符串(取决于匹配的条件)。

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

^(?wastebytes(condition)(chance1)|(chance2))