首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同卡的匹配正则图

不同卡的匹配正则图
EN

Stack Overflow用户
提问于 2020-06-29 18:18:01
回答 1查看 108关注 0票数 2

我有4个不同的正则表达式模式匹配器和相应的替换字符串。在我的java代码中,我检查每个regex并用值替换。无论如何,我可以合并成单个正则表达式和单个替换字符串吗?

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
for (int i = 0; i < regPatterns.size(); i++) {
  message = regPatterns.get(i).matcher(message).replaceAll(maskPatterns[i]);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 18:45:34

您可以使用结合所有给定的正则表达式。类似于:

代码语言:javascript
复制
^(\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)$

打破了上述正则表达式:

  • ^, $ --代表行的开始和结束--代表您的第一个捕获group.
  • (?<Disc>(6(?:011|5[0-9]{2})[0-9]{8}) --代表您的DISC_Card验证regex.
  • | --代表alternation.
  • (?<Mast>(?:5[0-9]{3}|2[2-7][0-9]{2})[0-9]{8}) --代表您的MAST_CARD验证正则表达式group.
  • (?<Visa>4[0-9]{11}) --代表您的VISA_CARD验证正则表达式组。

<代码>H 137(?<Amex>3[47][0-9]{9})) -代表您的AMEX_CARD验证regex group.

  • ([0-9]{4}\D) -代表您的第三个捕获组。(但根据新的regex,是7捕获group.)
  • NOTE:,我使用来区分它们并使它们更加清晰。)

您可以在中找到上述正则表达式的演示。

java中的示例实现:(请根据您的需求实现代码)

代码语言:javascript
复制
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
*/

您可以在中找到上述实现的示例运行结果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62644351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档