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
或其他任何字符串。
答案 0 :(得分:1)
你的正则表达式也许有点不对劲?以下内容将返回 HTML 。你的正则表达式缺少第二次捕获。
var ResourceTypeRegex = new Regex(@"^(?: )?\((\w+)\)$");
var value = " (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());
答案 1 :(得分:0)
以下所有示例都会在HTML
之后和字符串末尾的 (
之前返回)
。
(?<= \))
是一个后视,确保我们 (
之前HTML
(但不会将其添加到捕获的结果中)。如果我们在字符串末尾(?=\)$)
()
),$
是一个积极的预测检查。同样,)
不会消耗,也不属于匹配。
Regex ResourceTypeRegex = new Regex(@"^(?: \()?(\w+)(?=\)$)");
var value = " (HTML)";
var result56 = ResourceTypeRegex.Match(value).Groups[1].Value;
输出为HTML
,没有圆括号。 (?: \()?
使 )
可选。
如果你使用.SingleOrDefault()
,它将只返回第0个捕获组,即整个匹配。
答案 2 :(得分:0)
var match = Regex.Match(inputString, @"^ \((?<yourMatch>.*?)\)$");
var value = match.Groups["yourMatch"].Value;