正则表达式 数字模式的匹配
本文关键字:模式 数字 正则表达式 | 更新日期: 2023-09-27 17:55:35
我正在努力解析用户提供的输入,以获取属于指定模式的数字,例如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 ,正则表达式模式将它们分成 3 组而不是预期的 2 组。实际结果是
- 第一个组件是
1
- 第二个组件是
9
- 第三个组成部分是
9
在这种情况下,如何确保输入正确匹配?
尝试第三组的非贪婪版本:'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}?)$");
因为表达式需要第三个元素,所以它不能将 199 匹配为只有两组,因为它需要三个组才能匹配。
此外,您还允许第二组和第三组的零长度匹配。
尝试为第二组要求正好两个字符,或将第三组设置为可选。
使完整的最后一部分可选,而不仅仅是-
@"(?<first>'d)(?<second>'d{0,2})(?:-(?<third>'d{0,3}))?"
我将从-
开始的完整最后一部分放入一个可选的非捕获((?:)
)组(?:-(?<third>'d{0,3}))?
。因此,如果有-
,它将仅搜索第三组。