字符前后出现的次数相同

时间:2016-07-27 11:06:14

标签: c# .net regex

我正在尝试实现一个正则表达式来验证由两个必须始终具有相同长度的数字组成的代码。这些是可能值的一些示例:

  • 1 6
  • 12 67
  • 123 678
  • 1234 6789
  • 12345 67890

我有5位数的限制,所以我找到的唯一解决方案是:

^(
   ([0-9][ ][0-9])|
   ([0-9]{2}[ ][0-9]{2}) |
   ([0-9]{3}[ ][0-9]{3}) |
   ([0-9]{4}[ ][0-9]{4}) |
   ([0-9]{5}[ ][0-9]{5})
)$

接受任何建议或替代方案。经过一天的思考,这个解决方案是执行此检查的唯一方法,但我知道这很贪婪。

1 个答案:

答案 0 :(得分:1)

在.NET中,当您使用此正则表达式时,可以使用balancing constructs

^(?<o>\d){1,5} (?<-o>\d){1,5}(?(o)(?!))$

请参阅regex demo

另请参阅Matching Nested Constructs with Balancing Groups

模式匹配

  • ^ - 字符串的开头
  • (?<o>\d){1,5} - 匹配1至5位数字,将每个数字逐一捕获到o组,每次匹配加起来Captures堆栈
  • - space(如果使用RegexOptions.IngorePatternWhitespace标志,则放入字符类)
  • (?<-o>\d){1,5} - 每次从o组合堆中减去1到5位数字
  • (?(o)(?!)) - 检查组o堆栈的条件构造。如果它不为空((?(o))),则整个匹配失败((?!)为负前瞻)
  • $ - 字符串结束。

但是,您的变体枚举方法更快。