搜索并替换字符串Java中的SSN和/或信用卡
我希望在Java中搜索信用卡号和/或SSN的字符串,然后用占位符替换匹配项。由于某种原因,我无法理解这一点,因此,如果有任何帮助,我将不胜感激 下面是我写的一个方法。我认为我的正则表达式模式是错误的,因为它找不到任何一个。在google/stackoverflow上搜索,我惊讶地发现以前没有人这样做过,所以我认为这是一个很好的问题,可以添加到社区中 我需要搜索可能出现CC或SSN的所有格式,即111-11-1111/111111111/4111111111/4111-1111-1111-1111-1111-1111。我还需要搜索所有可能的信用卡(美国运通、VISA、DISCOVER等) 寻找最有创意的方式来做到这一点搜索并替换字符串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
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}”参考:我的答案使用了你的正则表达式。但我也加了这个。