var matches = Regex.Matches("abcde", "(?:ab(c))(d)").Cast<Match>().ToList();
在这种情况下https://regex101.com/将告诉'c'和'd'匹配。 但.Net会说有一个'abcd'组有一个捕获'abcd'。
如何设置.net的正则表达式以忽略非捕获组但返回内部组捕获。 (让它成为允许嵌套的解决方案会很棒,因为我从对象的树结构递归地创建了我的正则表达式。)
感谢。
答案 0 :(得分:3)
Match对象包含Groups,您需要使用Match.Groups
获取捕获的文本,而不是Captures。见MSDN Regex.Match
reference:
由于单个匹配可能涉及多个捕获组,
Match
具有返回Groups
的GroupCollection
属性。Match
实例本身等同于集合中的第一个对象,Match.Groups[0]
(在Visual Basic中为Match.Groups(0)
),表示整个匹配。
您
var matches = Regex.Matches("abcde", "(?:ab(c))(d)").Cast<Match>().ToList();
取这个:
您可以按如下方式访问您的值:
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;