0

我有测试字符串

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)应该只捕获数字?

4

3 回答 3

5

总是有一个隐含的“第 0 个”捕获组,其中填充了整个表达式匹配的内容。通常你应该忽略它。

如果您真的不想取回重复信息(这仅对智力练习有益),您可以将正则表达式转换为:

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

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

但同样,作为一个实际问题,只需忽略matches[0].

于 2013-04-03T14:28:43.743 回答
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
于 2013-04-03T14:27:22.460 回答
0

第一个匹配组始终包含整个匹配项,您对此无能为力。

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

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

于 2013-04-03T14:28:32.727 回答