无法排除.NET中的非捕获组

时间:2015-04-07 12:02:07

标签: c# .net regex regex-group

var regex = new Regex(@"^(?: )?\((\w+)\)$");
var value = " (HTML)";

//I tried to play around with the following but it captures the whole string
var match = ResourceTypeRegex.Match(resourceType);

//The following lines all evaluate to the entire string
match.Groups.OfType<Group>().SingleOrDefault();
match.Captures.OfType<Capture>().SingleOrDefault();
match.Groups[0].Captures.OfType<Capture>().SingleOrDefault();

我只想捕捉HTML或其他任何字符串。

3 个答案:

答案 0 :(得分:1)

你的正则表达式也许有点不对劲?以下内容将返回 HTML 。你的正则表达式缺少第二次捕获。

var ResourceTypeRegex = new Regex(@"^(?: )?\((\w+)\)$");
var value = "&nbsp;(HTML)";

var match = ResourceTypeRegex.Match(value);

Console.WriteLine("'" + match.Groups[1] + "'");

要获得捕获,请使用Groups数组从索引1开始。

我不确定你为什么要在这上面使用LINQ但是因为你坚持,你可以创建这个扩展方法:

public static IEnumerable<string> CapturingGroups(this GroupCollection c) {     
    var query = c.OfType<Group>().Select(g => g.Value);

    //We only want index 1 and over since 0 is actually the entire string
    //if (c.Count > 1)
        query = query.Skip(1);

    return query;
}

而不是使用match.Groups[1],您可以将其更改为Console.WriteLine("'{0}'",match.Groups.CapturingGroups().FirstOrDefault());

正在运行示例:https://dotnetfiddle.net/097fo9

答案 1 :(得分:0)

以下所有示例都会在HTML之后和字符串末尾的&nbsp;(之前返回)

(?<=&nbsp;\))是一个后视,确保我们&nbsp;(之前HTML(但不会将其添加到捕获的结果中)。如果我们在字符串末尾(?=\)$))),$是一个积极的预测检查。同样,)不会消耗,也不属于匹配。

Regex ResourceTypeRegex = new Regex(@"^(?:&nbsp;\()?(\w+)(?=\)$)");
var value = "&nbsp;(HTML)";
var result56 = ResourceTypeRegex.Match(value).Groups[1].Value;

输出为HTML,没有圆括号。 (?:&nbsp;\()?使&nbsp;)可选。

如果你使用.SingleOrDefault(),它将只返回第0个捕获组,即整个匹配

答案 2 :(得分:0)

var match = Regex.Match(inputString, @"^&nbsp;\((?<yourMatch>.*?)\)$");
var value = match.Groups["yourMatch"].Value;