正则表达式匹配行为,排除值

本文关键字:排除 正则表达式 | 更新日期: 2023-09-27 18:07:10

我有测试字符串

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

正则表达式匹配行为,排除值

总是有一个隐式的"第0 "捕获组,该捕获组使用整个表达式匹配的内容填充。通常你应该忽略它。

如果您真的不想返回重复的信息(这只适合智力练习),您可以将正则表达式转换为:

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

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

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

为什么是regex?=)

你可以这样做:

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

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

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

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