我有 4 个不同的正则表达式模式匹配器和相应的替换字符串。在我的 java 代码中,我检查每个正则表达式并替换为该值。无论如何,我可以合并单个正则表达式和单个替换字符串吗?
DISC_CARD=(\\W|000)(6(?:011|5[0-9]{2})[0-9]{8})([0-9]{4}\\D)
MAST_CARD=(\\W|000)((?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8})([0-9]{4}\\D)
VISA_CARD=(\\W|000)(4[0-9]{11})([0-9]{4}\\D)
AMEX_CARD=(\\W|000)(3[47][0-9]{9})([0-9]{4}\\D)
DISC_MASK=$1XXXXXXXXXXXX$3
MAST_MASK=$1XXXXXXXXXXXX$3
VISA_MASK=$1XXXXXXXXXXXX$3
AMEX_MASK=$1XXXXXXXXXXX$3
Java代码:
for (int i = 0; i < regPatterns.size(); i++) {
message = regPatterns.get(i).matcher(message).replaceAll(maskPatterns[i]);
}
最佳答案
您可以使用 alternation 来组合所有给定正则表达式。像这样的东西:
^(\W|000)((?<Disc>6(?:011|5[0-9]{2})[0-9]{8})|(?<Mast>(?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8})|(?<Visa>4[0-9]{11})|(?<Amex>3[47][0-9]{9}))([0-9]{4}\D)$
分解上述正则表达式:
-
^, $
- 分别表示行的开始和结束。 -
(\W|000)
- 代表您的第一个捕获组。 -
(?<Disc>(6(?:011|5[0-9]{2})[0-9]{8})
- 代表您的 DISC_Card 验证正则表达式。 -
|
- 表示交替。 -
(?<Mast>(?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8})
- 代表您的 MAST_CARD 验证正则表达式组。 -
(?<Visa>4[0-9]{11})
- 代表您的 VISA_CARD 验证正则表达式组。 -
(?<Amex>3[47][0-9]{9}))
- 代表您的 AMEX_CARD 验证正则表达式组。 -
([0-9]{4}\D)
- 代表您的第三个捕获组。(但根据新的正则表达式,它是第七个捕获组。) - 注意:我使用 named capturing group 是为了区分它们并使它们更易读。
您可以在here.中找到上述正则表达式的演示
java实现示例:(请根据您的要求实现代码。)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main{
// Regex pattern
private static final Pattern pattern = Pattern.compile("^(\\W|000)((?<Disc>6(?:011|5[0-9]{2})[0-9]{8})|(?<Mast>(?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8})|(?<Visa>4[0-9]{11})|(?<Amex>3[47][0-9]{9}))([0-9]{4}\\D)$", Pattern.MULTILINE);
// final array of strings to replace(First element for all the three and second element for the last one i.e. Amex Card)
private static final String[] replacementStrings = {"$1xxxxxxxxxxxx$7", "$1xxxxxxxxxxx$7"};
public static void main(String[] args){
// Input String
String str = "0006011123456781114D\n000341234567891234D\n0002421123456787891D\n0004123456789012346R\nTHisWOntMAtch";
for(String st : str.split("\n")){
System.out.println(getMaskedCardDetail(st));
}
}
// Utility Method for provide Masking of card details.
private static String getMaskedCardDetail(String givenString){
Matcher matcher = pattern.matcher(givenString);
if(matcher.matches()){
String temp = "";
if(matcher.group("Disc") != null || matcher.group("Mast") != null || matcher.group("Visa") != null)
temp = matcher.replaceAll(replacementStrings[0]);
else
temp = matcher.replaceAll(replacementStrings[1]);
return temp;
}else{
return "NO MATCH";
}
}
}
/*
Output:
000xxxxxxxxxxxx1114D
000xxxxxxxxxxx1234D
000xxxxxxxxxxxx7891D
000xxxxxxxxxxxx2346R
NO MATCH
*/
您可以在here.中找到上述实现的示例运行结果
关于java - 匹配不同卡片的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62644351/