gpt4 book ai didi

Java regex - 组合表达式

转载 作者:行者123 更新时间:2023-12-01 12:49:30 25 4
gpt4 key购买 nike

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

// 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()方法根据整个字符串验证正则表达式,因此您不需要开始 ^ 和结束 $ anchor 。此外,正则表达式引擎将这些字符 &! 作为文字进行匹配,看来您正在尝试将它们用作运算符。

要忽略这些模式,您可以使用Negative Lookahead来实现这一点。

(?!.*(?:(?: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

关于Java regex - 组合表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24343012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com