我需要验证序列号.为此我们在C#中使用正则表达式,而某个产品,序列号的一部分是"午夜以来的秒".一天有86400秒,但如何在此字符串中将其验证为5位数字?:
654984051-86400-231324
Run Code Online (Sandbox Code Playgroud)
我不能用这个概念:
[0-8][0-6][0-4][0-0][0-0]
Run Code Online (Sandbox Code Playgroud)
因为那时86399不会有效.我怎么能克服这个?我想要的东西:
[00000-86400]
Run Code Online (Sandbox Code Playgroud)
更新
我想清楚地表明我已经意识到 - 并且同意 - "当有一种更简单的方法时,不要使用正则表达式". Jason的答案正是我想要做的,但是这个序列号验证适用于通过我们系统的所有序列号 - 目前还没有针对这些特定序列号的自定义验证码. 在这种情况下,我有充分的理由寻找正则表达式解决方案.
当然,如果没有一个,那么这对于这些特定产品的自定义验证的情况是不可否认的,但我想在使用需要更改代码的解决方案之前完全探索这个途径.
jas*_*son 10
不要使用正则表达式?如果你正在努力想出正则表达式来解析它,那就说它可能太复杂而你应该找到更简单的东西.我认为在一个简单的时候使用正则表达式绝对没有任何好处
int value;
if(!Int32.TryParse(s, out value)) {
throw new ArgumentException();
}
if(value < 0 || value > 86400) {
throw new ArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)
会工作得很好.它非常清晰,易于维护.
你不想尝试使用正则表达式,你会得到一些难以理解,笨拙和难以修改的东西(有人可能会建议一个:).你想要做的是使用正则表达式匹配字符串以确保它包含所需格式的数字,然后拉出匹配组并使用算术比较检查范围.例如,在伪代码中:
match regex /(\d+)-(\d+)-(\d+)/
serial = capture group 2
if serial >= 0 and serial <= 86400 then
// serial is valid
end if
Run Code Online (Sandbox Code Playgroud)
使用标准的"这不是特别重复问题"的警告,
[0-7]\d{4}|8[0-5]\d{3}|86[0-3]\d{2}|86400
Run Code Online (Sandbox Code Playgroud)
生成正则表达式以匹配任意数字范围 http://utilitymill.com/utility/Regex_For_Range
产生以下正则表达式:
\b0*([0-9]{1,4}|[1-7][0-9]{4}|8[0-5][0-9]{3}|86[0-3][0-9]{2}|86400)\b
Run Code Online (Sandbox Code Playgroud)
输出描述:
First, break into equal length ranges:
0 - 9
10 - 99
100 - 999
1000 - 9999
10000 - 86400
Second, break into ranges that yield simple regexes:
0 - 9
10 - 99
100 - 999
1000 - 9999
10000 - 79999
80000 - 85999
86000 - 86399
86400 - 86400
Turn each range into a regex:
[0-9]
[1-9][0-9]
[1-9][0-9]{2}
[1-9][0-9]{3}
[1-7][0-9]{4}
8[0-5][0-9]{3}
86[0-3][0-9]{2}
86400
Collapse adjacent powers of 10:
[0-9]{1,4}
[1-7][0-9]{4}
8[0-5][0-9]{3}
86[0-3][0-9]{2}
86400
Combining the regexes above yields:
0*([0-9]{1,4}|[1-7][0-9]{4}|8[0-5][0-9]{3}|86[0-3][0-9]{2}|86400)
Run Code Online (Sandbox Code Playgroud)
在这里测试:http: //osteele.com/tools/rework/
| 归档时间: |
|
| 查看次数: |
3519 次 |
| 最近记录: |