我正在尝试实现一个正则表达式来验证由两个必须始终具有相同长度的数字组成的代码。这些是可能值的一些示例:
- 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})
)$
接受任何建议或替代方案。经过一天的思考,这个解决方案是执行此检查的唯一方法,但我知道这是贪婪的。
最佳答案
在 .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
堆栈中 -
RegexOptions.IngorePatternWhitespace
标志,则放入字符类) -
(?<-o>\d){1,5}
- 每次从o
组堆栈中减去一个值 1 到 5 位 -
(?(o)(?!))
- 检查组o
堆栈的条件构造。如果不为空((?(o))
),则整个匹配失败((?!)
负前瞻) -
$
- 字符串结尾。
但是,您的变体枚举方法更快。
关于c# - 一个字符前后出现的次数相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611215/