正则表达式 数字模式的匹配

本文关键字:模式 数字 正则表达式 | 更新日期: 2023-09-27 17:55:35

我正在努力解析用户提供的输入,以获取属于指定模式的数字,例如199-234

其中

  1. 第一个组件是1
  2. 第二个组件是99
  3. 第三个组成部分是234

用户将只提供前几个数字或整个字符串。我打算解析出每个组件。我想出的正则表达式是 -

Regex regex = new Regex(@"(?<first>'d)(?<second>'d{0,2})-?(?<third>'d{0,3})");
var groups = regex.Match(input);

如果我提供输入 199 ,正则表达式模式将它们分成 3 组而不是预期的 2 组。实际结果是

  1. 第一个组件是1
  2. 第二个组件是9
  3. 第三个组成部分是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}))?。因此,如果有-,它将仅搜索第三组。