正则表达式确保在字符串如"05123:12315"中,第一个数字小于第二个?

Dal*_*lal 1 c# regex

我必须有x:y格式的字符串,其中xy必须是五位数(零填充)和x <= y.

例:

00515:02152
Run Code Online (Sandbox Code Playgroud)

Regex会匹配这种格式?

如果可能,请简要解释一下解决方案,以帮助我学习.

编辑:为什么我需要正则表达式?我编写了一个通用工具,它根据配置文件获取输入并验证它.弹出一个意外的要求,要求我以我显示的格式验证字符串(使用配置文件).我希望使用我编写的现有配置框架来解决这个问题,因为拆分和解析将超出此工具的范围.对于像这样的一个突出的要求,我不介意有一些非正统/凌乱的正则表达式,只要它不是10000行长.任何使用Regex的智能解决方案都表示赞赏!谢谢.

Ro *_* Mi 7

描述

此表达式将验证前5位数字是否小于第5位数字,其中零填充5位数字在:分隔字符串中并格式化为01234:23456.

^
(?:
(?=0....:[1-9]|1....:[2-9]|2....:[3-9]|3....:[4-9]|4....:[5-9]|5....:[6-9]|6....:[7-9]|7....:[8-9]|8....:[9])
|(?=(.)(?:0...:\1[1-9]|1...:\1[2-9]|2...:\1[3-9]|3...:\1[4-9]|4...:\1[5-9]|5...:\1[6-9]|6...:\1[7-9]|7...:\1[8-9]|8...:\1[9]))
|(?=(..)(?:0..:\2[1-9]|1..:\2[2-9]|2..:\2[3-9]|3..:\2[4-9]|4..:\2[5-9]|5..:\2[6-9]|6..:\2[7-9]|7..:\2[8-9]|8..:\2[9]))
|(?=(...)(?:0.:\3[1-9]|1.:\3[2-9]|2.:\3[3-9]|3.:\3[4-9]|4.:\3[5-9]|5.:\3[6-9]|6.:\3[7-9]|7.:\3[8-9]|8.:\3[9]))
|(?=(....)(?:0:\4[1-9]|1:\4[2-9]|2:\4[3-9]|3:\4[4-9]|4:\4[5-9]|5:\4[6-9]|6:\4[7-9]|7:\4[8-9]|8:\4[9]))
)
\d{5}:\d{5}$
Run Code Online (Sandbox Code Playgroud)

现场演示:http: //www.rubular.com/r/w1QLZhNoEa

请注意,这是使用x选项忽略所有空格并允许注释,如果您使用此选项,x则表达式将需要全部在一行

在此输入图像描述


Eri*_*ert 5

您想要识别的语言是有限的,因此最简单的方法是列出由"或"分隔的所有案例.你想要的正则表达式是:

(00000:[00000|00001| ... 99999])|  ...  |(99998:[99998|99999])|(99999:99999)
Run Code Online (Sandbox Code Playgroud)

该正则表达式将长达数十亿个字符并且需要相当长的时间才能执行,但这正是您所要求的:与所述语言匹配的正则表达式.

显然这是不切实际的.现在很清楚为什么正则表达式是这项工作的错误工具?使用正则表达式匹配5位数 - 冒号 - 五位数,然后一旦知道了,就拆分字符串并将两组数字转换为可以比较的整数.

  • @Denomales:的确,你给出了一个很好的例子.我的观点有两个:(1)任何有限的语言都是规则的,但这并不意味着正则表达式很方便,而且(2)一些在正则表达式之外非常简单的任务 - 例如比较两个整数 - 在正则表达式中很复杂.你的例子非常清楚地说明了后一点. (5认同)