我正在尝试实现一个正则表达式来验证由两个必须始终具有相同长度的数字组成的代码。这些是可能值的一些示例:
我有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})
)$
接受任何建议或替代方案。经过一天的思考,这个解决方案是执行此检查的唯一方法,但我知道这很贪婪。
答案 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))
),则整个匹配失败((?!)
为负前瞻)$
- 字符串结束。但是,您的变体枚举方法更快。