java - 匹配不同卡片的正则表达式模式

标签 java regex java-8

我有 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/

相关文章:

java - 我们如何在 Redis 中存储和检索可序列化的 Java 对象作为值

java - 在分组依据中使用自定义 map 供应商时出现 ClassCastException

java - 使用流迭代列表时获取索引

java - RxJava。读取文件以观察

java - 获取计算机上使用 Java 安装的软件列表

java - Lucene 2.4.1 索引将使用 lucene 6.2.1 重新索引

java - 在vlcj MediaPlayer上添加透明JLabel?

JavaScript/jQuery : extract phone numbers from string

regex - Linux - 想要检查可能的重复目录(可能需要 RegEx)

字符串中有空格时 Python 正则表达式变慢