我正在根据以下限制来验证跟踪信息的要求:
格式:COPYYYY#####
COP
是每个跟踪信息的固定前缀
YYYY
是提交跟踪信息的年份,(有效年份:2015-2018)
#####
是随机产生的5位数字
跟踪信息应仅包含3个字母字符(COP前缀)
跟踪信息应在前3个字母字符后紧跟9个数字字符。
跟踪信息的长度应恰好为12个字符
由于正则表达式不是验证数字范围的理想解决方案,因此我决定在格式有效后再检查一年。
COP
后跟9位数字(即COPXXXXXXXXX
)
即使输入正确,下面的正则表达式也总是返回false。
/^COP\d{9}$/
请提出对上述正则表达式的更正建议,并分享有关验证正则表达式中年份范围的想法(如果使用的是更干净的方法)。
答案 0 :(得分:1)
使用正则表达式模式\bCOP(201[5-8])(\d{5})\b
测试源代码(JavaScript):
var re = /\bCOP(201[5-8])(\d{5})\b/g;
var s = 'To track your packages, enter COP201812345 and COP201867890 at www.example.org';
var m;
do {
m = re.exec(s);
if (m) {
var e = document.createElement('div');
e.innerHTML = 'Match: ' + m[0] + ' (Year: ' + m[1] + ', Id: ' + m[2] + ')';
document.getElementById("output").appendChild(e);
}
} while (m);
测试源代码(Java):
String s = "To track your packages, enter COP201812345 and COP201867890 at www.example.org";
Matcher m = Pattern.compile("\\bCOP(201[5-8])(\\d{5})\\b").matcher(s);
while (m.find())
System.out.println(
"Match: " + m.group() +
" (Year: " + m.group(1) + ", Id: " + m.group(2) + ")");
}
输出:
匹配:COP201812345(年份:2018,ID:12345)
比赛:COP201867890(年:2018,ID:67890)
答案 1 :(得分:-1)
使用下面的代码。
String value = "COP201812345";
Pattern p = Pattern.compile("^(COP)(201[5-8])(\\d{5})$");
Matcher m = p.matcher(value);
if (m.find()) {
System.out.println("Tracking number " + value + " is valid");
System.out.println("Tracking prefix: " + m.group(1));
System.out.println("Year between 2015 and 2018 is: " + m.group(2));
System.out.println("Random 5 digit number is: " + m.group(3));
}
else {
System.out.println("No match");
}
输出:
跟踪号COP201812345有效
跟踪前缀:COP
2015年至2018年之间的年份是:2018年
随机5位数字是:12345