java - 如何在Java中使用正则表达式屏蔽字符串中的多个值
问题描述
我是正则表达式的新手,并试图为我的代码实现正则表达式。我的代码正在接收包含一些我需要屏蔽的属性的消息字符串。现在消息字符串的格式可以略有不同,屏蔽属性可以是动态的。这是示例
String message1 ="details-\r\n"+
"pin:testpin\r\n"+
"pass:test\r\n";
String message2 = "{\"pin\":\"1234\",\"pass\":\"test\"}";
如果我想屏蔽 pin 并通过两者,我们可以编写有效的正则表达式吗?
解决方案
这些正则表达式正在寻找pin
或被pass
包围,"
然后:"
寻找"
尽快关闭(.*?
是非贪婪的)。这些值被替换为*
message2 = message2.replaceAll("\\\"pin\\\":\\\".*?\\\"", "\"pin\":\"****\"")
.replaceAll("\\\"pass\\\":\\\".*?\\\"", "\"pass\":\"****\"");
它有一个缺点,"
可能不是pin
or值的一部分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 方法来替换找到的内容。我需要它才能知道匹配组的长度。然后使用该长度创建一个包含*
输入长度的字符串。
我还在正则表达式中添加了组。(
组是由和包围的正则表达式的一部分)
。然后匹配器可以使用这些组来更轻松地修改输入。
推荐阅读
- node.js - 从 angular2 中的 API 响应中解压缩或解压缩数据
- excel - MS Excel 收到 ORA-12560 协议适配器错误(SQLSetConnectAttr 失败)
- node.js - 在nodejs中查询leveldb数据库中的值
- python - 是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?
- javascript - 使用 onClick 无休止地重新渲染 React 组件
- google-bigquery - BigQuery 代码段中的错误
- python - 将函数/计算应用于熊猫中的多个列
- python - Dask中掩码函数的正则表达式
- .net-standard-2.0 - System.Windows 命名空间中不存在“应用程序”(在库项目中)
- visual-studio - 顶部功能列表菜单,无鼠标