如何使regexp只捕获内部组

时间:2015-09-04 02:20:05

标签: c# regex

   var matches = Regex.Matches("abcde", "(?:ab(c))(d)").Cast<Match>().ToList();

在这种情况下https://regex101.com/将告诉'c'和'd'匹配。 但.Net会说有一个'abcd'组有一个捕获'abcd'。

如何设置.net的正则表达式以忽略非捕获组但返回内部组捕获。 (让它成为允许嵌套的解决方案会很棒,因为我从对象的树结构递归地创建了我的正则表达式。)

感谢。

1 个答案:

答案 0 :(得分:3)

Match对象包含Groups,您需要使用Match.Groups获取捕获的文本,而不是Captures。见MSDN Regex.Match reference

  

由于单个匹配可能涉及多个捕获组,Match具有返回GroupsGroupCollection属性。 Match实例本身等同于集合中的第一个对象,Match.Groups[0](在Visual Basic中为Match.Groups(0)),表示整个匹配。

var matches = Regex.Matches("abcde", "(?:ab(c))(d)").Cast<Match>().ToList();

取这个:

enter image description here

您可以按如下方式访问您的值:

var first_c= matches[0].Groups[1].Value;
var first_d= matches[0].Groups[2].Value;

使用命名捕获将使您能够以这种方式访问​​它们:

var matches = Regex.Matches("abcde", "(?:ab(?<myc>c))(?<myd>d)").Cast<Match>().ToList();
var first_c= matches[0].Groups["myc"].Value;
var first_d= matches[0].Groups["myd"].Value;