搜索并替换字符串Java中的SSN和/或信用卡

搜索并替换字符串Java中的SSN和/或信用卡,java,regex,json,string,Java,Regex,Json,String,我希望在Java中搜索信用卡号和/或SSN的字符串,然后用占位符替换匹配项。由于某种原因,我无法理解这一点,因此,如果有任何帮助,我将不胜感激 下面是我写的一个方法。我认为我的正则表达式模式是错误的,因为它找不到任何一个。在google/stackoverflow上搜索,我惊讶地发现以前没有人这样做过,所以我认为这是一个很好的问题,可以添加到社区中 我需要搜索可能出现CC或SSN的所有格式,即111-11-1111/111111111/4111111111/4111-1111-1111-1111

我希望在Java中搜索信用卡号和/或SSN的字符串,然后用占位符替换匹配项。由于某种原因,我无法理解这一点,因此,如果有任何帮助,我将不胜感激

下面是我写的一个方法。我认为我的正则表达式模式是错误的,因为它找不到任何一个。在google/stackoverflow上搜索,我惊讶地发现以前没有人这样做过,所以我认为这是一个很好的问题,可以添加到社区中

我需要搜索可能出现CC或SSN的所有格式,即111-11-1111/111111111/4111111111/4111-1111-1111-1111-1111-1111。我还需要搜索所有可能的信用卡(美国运通、VISA、DISCOVER等)

寻找最有创意的方式来做到这一点

private static final String ssnPattern = "^\\d{3}-?\\d{2}-?\\d{4}$";
private static final String ccPattern = ".*^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]    {14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$.*";

private static final Pattern ssnDetector = Pattern.compile(ssnPattern);
private static final Pattern ccDetector = Pattern.compile(ccPattern);
private static final String CC_PLACEHOLDER = "{CREDIT_CARD_REDACTED}";
private static final String SSN_PLACEHOLDER = "{SSN_REDACTED}";

public static void main(String[] args){
    String body3 = "Here is my credit card 4111111111111111 and my SSN 111-22-3333";
    body3 = redactCC(body3);
    body3 = redactSSN(body3);
    logger.info(body3);
}

public static String redactSSN(String data){
   Matcher m = ssnDetector.matcher(data);
   return m.replaceAll(SSN_PLACEHOLDER);
}

public static String redactCC(String data){
   Matcher m = ccDetector.matcher(data);
   return m.replaceAll(CC_PLACEHOLDER);
}

No^,No$,No.*并删除了{14}之前的空格

private static final String ssnPattern = "\\d{3}-?\\d{2}-?\\d{4}";
private static final String ccPattern = "(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|" +
 "6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|" + 
 "(?:2131|1800|35\\d{3})\\d{11}|" +
 "(?:4\\d{3}|5[1-5]\\d{2}|6011|7\\d{3})-?\\d{4}-?\\d{4}-?\\d{4}|3[4,7]\\d{13})";
修正错别字m组

while (n.find()) {
    System.out.println("Found a " + n.group() + ".");   

你的信用卡正则表达式对我来说太复杂了。但是我认为SSN正则表达式中的
^
$
导致了问题。有了这些,它将仅在源字符串仅由SSN组成时匹配
^
表示三位数字必须出现在字符串的开头,
$
表示四位数字必须出现在字符串的结尾。信用卡模式中的
^
$
也没有帮助。也许您想使用
\b
?与“单词边界”匹配,因此它要求SSN或信用卡号码是它们自己的“单词”。如果使用
\b
,请确保字符串文本中的反斜杠加倍。(如果您不这样做,它将尝试匹配一个退格字符。)是的,这非常有效。谢谢CC正则表达式仍然是必需的。这并不能正确地完成所有的CC,也不能用于虚线模式。添加这个用于CC验证-“((4\\d{3})(5[1-5]\\d{2})|(6011)|(7\\d{3})-?\\d{4}-?\\d{4}-?\\d{4}-?\\d{4}-\\d{3[4,7]\\d{13}”参考:我的答案使用了你的正则表达式。但我也加了这个。