首页 > 解决方案 > 如何在Java中使用正则表达式屏蔽字符串中的多个值

问题描述

我是正则表达式的新手,并试图为我的代码实现正则表达式。我的代码正在接收包含一些我需要屏蔽的属性的消息字符串。现在消息字符串的格式可以略有不同,屏蔽属性可以是动态的。这是示例

String message1 ="details-\r\n"+
 "pin:testpin\r\n"+
 "pass:test\r\n";
String message2 = "{\"pin\":\"1234\",\"pass\":\"test\"}";

如果我想屏蔽 pin 并通过两者,我们可以编写有效的正则表达式吗?

标签: javaregex

解决方案


这些正则表达式正在寻找pin或被pass包围,"然后:"寻找"尽快关闭(.*?是非贪婪的)。这些值被替换为*

message2 = message2.replaceAll("\\\"pin\\\":\\\".*?\\\"", "\"pin\":\"****\"")
                   .replaceAll("\\\"pass\\\":\\\".*?\\\"", "\"pass\":\"****\"");

它有一个缺点,"可能不是pinor值的一部分pass

这是一个最小的测试:

public class Test {
  public static void main(String[]arg) {
    String message2 = "{\"pin\":\"1234\",\"pass\":\"test\"}";
    message2 = message2.replaceAll("\\\"pin\\\":\\\".*?\\\"", "\"pin\":\"****\"")
                       .replaceAll("\\\"pass\\\":\\\".*?\\\"", "\"pass\":\"****\"");
    System.out.print(message2);
  }
}

这是替换正确长度的更大示例。这里还有更多事情要做:

import java.util.regex.*;

public class Test {
    public static void main(String[]arg) {
        //more complex
        String message1 ="details-\r\n" + "pin:testpin\r\n" + "pass:test\r\n";
        String regex1 = "(\\r\\npin:)(.*?)(\\r\\npass:)(.*?)(\\r\\n)";
        message1 = Pattern
            .compile(regex1)
            .matcher(message1)
                .replaceAll(mr -> mr.group(1) + "*".repeat(mr.group(2).length()) + mr.group(3) + "*".repeat(mr.group(4).length()) + mr.group(5));


        String message2 = "{\"pin\":\"1234\",\"pass\":\"test\"}";
        String regex2 = "(\\\")(pin|pass)(\\\":\\\")(.*?)(\\\")";       
        message2 = Pattern
            .compile(regex2)
            .matcher(message2)
                .replaceAll(mr -> mr.group(1) + mr.group(2) + mr.group(3) + "*".repeat(mr.group(4).length()) + mr.group(5));

        System.out.println(message1);
        System.out.println(message2);
    }
}

在更大的示例中,我使用带有 lambda 函数的 replaceAll 方法来替换找到的内容。我需要它才能知道匹配组的长度。然后使用该长度创建一个包含*输入长度的字符串。

我还在正则表达式中添加了组。(组是由和包围的正则表达式的一部分)然后匹配器可以使用这些组来更轻松地修改输入。


推荐阅读