用于验证自定义跟踪信息的正则表达式

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)


测试一下here (JavaScript) and here (Java).

使用下面的代码。

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