c# - 一个字符前后出现的次数相同

标签 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})
)$

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

最佳答案

在 .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/

相关文章:

c# - Graphics.DrawImage 意外调整图像大小

c# - 使用 LibTiff.Net 重复目录更新现有图像中的标签

.net - LINQ:使用 FirstOrDefault 返回一个成员或另一个成员

JavaScript 按多个分隔符分割并保留引用的文本

c# - 如何从谓词对象中删除重复项?

c# - 多线程线程安全读/写锁定的最佳 C# 解决方案?

c# - 需要一些关于尝试模拟 .NET WebClient 或等效物的建议

regex - 正则表达式 :buffer same characters

.net - 在 VB.NET 中使用正则表达式从字符串中解析数字

c# - 如何指定 clickOnce 应用程序的目标文件夹?