正则表达式匹配数字模式

时间:2011-05-10 00:19:46

标签: c# regex

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

其中

  1. 第一个组件是1
  2. 第二个组件是99
  3. 第三个组件是234
  4. 用户只提供前几个数字或整个字符串。我打算解析每个组件。我提出的注册表是 -

    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. 第一个组件是1
    2. 第二个组件是9
    3. 第三个组件是9
    4. 在这种情况下,如何确保输入正确匹配?

3 个答案:

答案 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}))?。因此,如果存在-,它将仅搜索第三组。