字符前后出现的次数相同

本文关键字:字符 | 更新日期: 2023-09-27 17:58:46

我试图实现一个正则表达式来验证由两个长度必须始终相同的数字组成的代码。以下是一些可能值的例子:

  • 1 6
  • 12 67
  • 123 678
  • 1234 6789
  • 1234567890

我有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})
)$

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

字符前后出现的次数相同

在.NET中,当您使用此regex风格时,您可以利用平衡结构

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

查看regex演示

另请参阅将嵌套构造与平衡组匹配

图案与匹配

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

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