Java组合表达式



我正在尝试编写代码,使用正则表达式返回信用卡供应商,这似乎是有效的,例如:

// Visa - always begins digit 4, 13 or 16 digits long
^[4].{12}|^[4].{15} 
// Visa Electron - begin with the code pattern, 16 digits long
4026.{12}|417500.{10}|4405.{12}|4508.{12}|4844.{12}|4913.{12}|4917.{12}

对于isVisa方法,我希望正则表达式为"根据Visa正则表达式返回Visa,但不是Visa Electron"

这段代码不起作用:

    public static String isVisa(String number) {
    Pattern p = Pattern.compile("^[4].{12}|^[4].{15}&&(!4026.{12}|!417500.{10}|!4405.{12}|!4508.{12}|!4844.{12}|!4913.{12}|!4917.{12})");
    Matcher m = p.matcher(number);
    if (m.matches()) return "Visa";
    else return "";
}

matches()方法针对整个字符串验证正则表达式,因此您不需要开始^和结束$锚。此外,正则表达式引擎匹配这些字符&!作为字面量,这似乎是你试图使用它们作为操作符。

要忽略这些模式,您可以使用负向前看来实现此目的。

(?!.*(?:(?:4026|4405|4508|4844|4913|4917).{12}|417500.{10}))(?=4.{12}|4.{15}).*

示例:这将返回前两个的true,因为其余的对于您的情况无效。

String[] numbers = { "4000236512341234", "4000222213232222", "4026122222222222", 
                     "4175000000000000", "4405343434344343", "4508111111111111",
                     "4844000000000000", "4913000000000000", "4917000000000000" };
Pattern p = Pattern.compile("(?!.*(?:(?:4026|4405|4508|4844|4913|4917).{12}|417500.{10}))(?=4.{12}|4.{15}).*");
for (String x: numbers) {
    Matcher m = p.matcher(x);
    System.out.println(m.matches());
}

:

true
true
false
false
false
false
false
false
false

使用正查找和负查找来检查以某些数字开头而不是以某些特定数字开头的行

^(?!417500.{10}|4026.{12}|4405.{12}|4508.{12}|4844.{12}|4913.{12}|4917.{12})(?=4.{12}|4.{15}).*
演示

你可以使用一个非常简单和容易理解的正则表达式:

4026.{12}|417500.{10}|4405.{12}|4508.{12}|4844.{12}|4913.{12}|4917.{12}|([4].{12}|[4].{15})

这将匹配所有的Visa电子模式而不捕获任何东西。当你得到一个匹配,检查捕获组1不是null它是Visa。

最新更新