【问题标题】:matching regex pattern for different cards匹配不同卡片的正则表达式模式
【发布时间】:2020-10-19 23:36:38
【问题描述】:

我有 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]);
}

【问题讨论】:

    标签: java regex java-8


    【解决方案1】:

    您可以使用alternation 来组合您所有的 given 正则表达式。比如:

    ^(\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) - 代表您的第一个捕获组。
    • (?&lt;Disc&gt;(6(?:011|5[0-9]{2})[0-9]{8}) - 代表您的 DISC_Card 验证正则表达式。
    • | - 表示交替。
    • (?&lt;Mast&gt;(?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8}) - 代表您的 MAST_CARD 验证正则表达式组。
    • (?&lt;Visa&gt;4[0-9]{11}) - 代表您的 VISA_CARD 验证正则表达式组。
    • (?&lt;Amex&gt;3[47][0-9]{9})) - 代表您的 AMEX_CARD 验证正则表达式组。
    • ([0-9]{4}\D) - 代表您的第 3 个捕获组。(但根据新的正则表达式,它是 第 7 个捕获组。)
    • 注意:我使用named capturing group 是为了区分它们并使它们更易读。

    你可以在here.找到上述正则表达式的demo

    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.中找到上述实现的示例运行结果

    【讨论】:

    • 变量替换呢?
    • 对。美国运通的更短。
    • @shmosel;逻辑是我们可以根据命名组进行匹配,并相应地选择替换字符串。比如amexReplacementStringvisaReplacementString等等。我稍后会发布整个实现。
    • @skumar;你想要它应该匹配吗?如果是这种情况,则从您的组 1 中删除 \W 或在其之前使用任何非单词字符。即(000|) 。或者您可以做的另一件事是删除开始和结束分隔符。即^ and $.
    • 我会试一试,让你知道。感谢您提供这些详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2013-11-25
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多