正则表达式匹配行为,排除值
本文关键字:排除 正则表达式 | 更新日期: 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]从第一个捕获组开始