Reg表达式匹配行为,排除值?

时间:2013-04-03 14:23:28

标签: c# regex

我有测试字符串

var test = "test[2][3][4]";

我需要从中提取整数 - 2,3,4

我有这样的代码

    var regex = new Regex(@"\[(\d)\]", RegexOptions.IgnoreCase | RegexOptions.Singleline);

    var matches = regex.Matches(test);

将这些值返回给我

matches[0].Groups[0].Value = "[2]"
matches[0].Groups[1].Value = "2

我真的不需要[2],但我不知道要改变什么才能排除它?如果我理解正确,捕获组(\d)应仅捕获数字?

3 个答案:

答案 0 :(得分:5)

总会有一个隐含的“第0个”捕获组,它将填充表达式作为整体匹配的内容。通常你应该忽略它。

如果您确实想要不回复重复信息(这只适用于智力练习),您可以将正则表达式转换为:

@"(?<=\[)\d(?=\])"

使用正面和负面的lookbehind,您可以断言您的数字被方括号包围而不实际捕获它们。这样matches[0]就是你想要的。由于上面的表达式中没有捕获组,因此没有matches[1]

但是,作为一个实际问题,请忽略matches[0]

答案 1 :(得分:1)

为何选择正则表达式? =)

你可以这样做:

var test = "test[2][3][4]";
var numbers = test.Where(Char.IsDigit)
                  .Select(c => int.Parse(c.ToString()))
                  .ToArray();
//Numbers will now be a array with the integers : 2,3,4
//numers[0] = 2
//numers[1] = 3
//numers[2] = 4

答案 2 :(得分:0)

第一个匹配组总是包含整个匹配,你无能为力。

  

如果正则表达式引擎可以找到匹配的第一个元素   Groups属性返回的GroupCollection对象包含   与整个正则表达式模式匹配的字符串。   (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.match.groups.aspx

正如您在该页面上的示例中所看到的,您可以从匹配[0] .Groups [1]开始,以第一个捕获组开始。