用于验证自定义跟踪信息的正则表达式
Regex to validate custom tracking information
我正在处理验证跟踪信息的要求,但有以下限制:
格式:COPYYYY#####
COP
是每条tracking信息的固定前缀
YYYY
为提交追踪信息的年份(有效年份:2015-2018)
#####
是一个随机生成的5位数字
跟踪信息只能包含 3 个字母字符(COP 前缀)
跟踪信息的前 3 个字母字符后应恰好包含 9 个数字字符。
跟踪信息的长度应恰好为 12 个字符
由于正则表达式不是验证数字范围的好方法,我决定在格式有效后一年后再进行检查。
COP
后接 9 位数字(即 COPXXXXXXXXX
)
下面的正则表达式总是返回 false,即使输入正确。
/^COP\d{9}$/
请对上述正则表达式提出更正建议,并分享关于在正则表达式中验证年份范围的想法(如果它是更简洁的方法)。
使用正则表达式模式\bCOP(201[5-8])(\d{5})\b
测试源代码(Java脚本):
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) + ")");
}
输出:
Match: COP201812345 (Year: 2018, Id: 12345)
Match: COP201867890 (Year: 2018, Id: 67890)
使用下面的代码。
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");
}
输出:
Tracking number COP201812345 is valid
Tracking prefix: COP
Year between 2015 and 2018 is: 2018
Random 5 digit number is: 12345
我正在处理验证跟踪信息的要求,但有以下限制:
格式:COPYYYY#####
COP
是每条tracking信息的固定前缀
YYYY
为提交追踪信息的年份(有效年份:2015-2018)
#####
是一个随机生成的5位数字
跟踪信息只能包含 3 个字母字符(COP 前缀)
跟踪信息的前 3 个字母字符后应恰好包含 9 个数字字符。
跟踪信息的长度应恰好为 12 个字符
由于正则表达式不是验证数字范围的好方法,我决定在格式有效后一年后再进行检查。
COP
后接 9 位数字(即 COPXXXXXXXXX
)
下面的正则表达式总是返回 false,即使输入正确。
/^COP\d{9}$/
请对上述正则表达式提出更正建议,并分享关于在正则表达式中验证年份范围的想法(如果它是更简洁的方法)。
使用正则表达式模式\bCOP(201[5-8])(\d{5})\b
测试源代码(Java脚本):
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) + ")");
}
输出:
Match: COP201812345 (Year: 2018, Id: 12345)
Match: COP201867890 (Year: 2018, Id: 67890)
使用下面的代码。
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");
}
输出:
Tracking number COP201812345 is valid
Tracking prefix: COP
Year between 2015 and 2018 is: 2018
Random 5 digit number is: 12345