我正在解析属于指定模式的数字的用户提供的输入,例如199-234
其中
1
99
234
用户只提供前几个数字或整个字符串。我打算解析每个组件。我提出的注册表是 -
Regex regex = new Regex(@"(?<first>\d)(?<second>\d{0,2})-?(?<third>\d{0,3})");
var groups = regex.Match(input);
如果我提供输入 199 ,则reg-ex模式将它们分成3组而不是预期的2组。 实际结果是
1
9
9
在这种情况下,如何确保输入正确匹配?
答案 0 :(得分:3)
尝试第三组的非贪婪版本:\d{0,3}?
Regex regex = new Regex(@"(?<first>\d)(?<second>\d{0,2})-?(?<third>\d{0,3}?)");
var groups = regex.Match(input);
它也可能有助于(为了清楚起见)绑定字符串的开头和结尾(^
和$
)
new Regex(@"^(?<first>\d)(?<second>\d{0,2})-?(?<third>\d{0,3}?)$");
答案 1 :(得分:0)
因为你的表达式需要第三个元素,所以它只能将199与两个组匹配,因为匹配需要三个组。
此外,您允许第二组和第三组的零长度匹配。
尝试为第二组准确要求两个字符或使第三组可选。
答案 2 :(得分:0)
使完整的最后一部分可选,而不仅仅是-
@"(?<first>\d)(?<second>\d{0,2})(?:-(?<third>\d{0,3}))?"
我将完整的最后一部分从-
开始放入可选的非捕获((?:)
)组(?:-(?<third>\d{0,3}))?
。因此,如果存在-
,它将仅搜索第三组。