正则表达式以验证自定义跟踪信息

时间:2018-10-24 14:20:43

标签: javascript java regex regex-lookarounds regex-group

我正在根据以下限制来验证跟踪信息的要求:

格式:COPYYYY#####

COP是每个跟踪信息的固定前缀

YYYY是提交跟踪信息的年份,(有效年份:2015-2018)

#####是随机产生的5位数字

跟踪信息应仅包含3个字母字符(COP前缀)

跟踪信息应在前3个字母字符后紧跟9个数字字符。

跟踪信息的长度应恰好为12个字符


由于正则表达式不是验证数字范围的理想解决方案,因此我决定在格式有效后再检查一年。

COP后跟9位数字(即COPXXXXXXXXX

即使输入正确,下面的正则表达式也总是返回false。

/^COP\d{9}$/

请提出对上述正则表达式的更正建议,并分享有关验证正则表达式中年份范围的想法(如果使用的是更干净的方法)。

2 个答案:

答案 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)


对其进行测试 here (JavaScript)和 here (Java)。

答案 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