gpt4 book ai didi

java - 使用正则表达式匹配字符串中的参数值

转载 作者:行者123 更新时间:2023-12-03 02:23:33 28 4
gpt4 key购买 nike

我有一个包含多个参数的字符串,例如

PARAM1="someValue", PARAM2="someOtherValue"...

对于日志输出,我想“隐藏”一些参数的值,即用 *** 替换它们。

我使用以下正则表达式来匹配参数值,这在大多数情况下都可以正常工作:

(PARMANAME=")[\w\s]*"

但是,此正则表达式仅匹配单词和空白字符。我想扩展它以匹配两个引号之间的所有字符。问题是,值本身可以包含(转义的)引号,例如:

PARAM="the name of this param is \"param\""

如何正确匹配(和替换)它?

我的 Java 方法如下所示:

/**
* @param input input string
* @param params list of parameters to hide
* @return string with the value of the parameter being replace by ***
*/
public static String hideParamValue(String input, final String... params)
{
for (String param : params)
{
input = input.replaceAll("(" + param + "=)\\\"[\\w\\s]*\\\"", "$1***");
}
return input;
}

最佳答案

转义引号是 Java 中真正的 PITA,但这应该可以解决问题:

public class Test
{
public static String hideParamValue(String input, final String... params)
{
for (String param : params)
{
input = input.replaceAll(
"(" + param + "=)\"(?:[^\"\\\\]|\\\\.)*\"",
"$1***");
}
return input;
}

public static void main(String[] args)
{
String s = "PARAM1=\"a b c\", PARAM2=\"d \\\"e\\\" f\", PARAM3=\"g h i\"";
System.out.println(s);
System.out.println(hideParamValue(s, "PARAM2", "PARAM3"));
}
}

输出:

PARAM1="a b c", PARAM2="d \"e\" f", PARAM3="g h i"
PARAM1="a b c", PARAM2=***, PARAM3=***

[^\"\\\\] 匹配除引号或反斜杠之外的任何一个字符。反斜杠必须用正则表达式的另一个反斜杠进行转义,然后每个反斜杠都具有对字符串文字进行转义。但引号在正则表达式中没有特殊含义,因此只需要一个反斜杠。

(?:[^\"\\\\]|\\\\.) 匹配除引号或反斜杠之外的任何内容,或者反斜杠后跟任何内容。这样就可以了您转义的引号,还允许转义反斜杠和其他转义序列,无需额外费用。

@axtavt 建议的否定后向查找方法仅处理转义引号,并将 \\" 视为反斜杠后跟转义引号,而它可能旨在作为转义反斜杠后跟报价。

关于java - 使用正则表达式匹配字符串中的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3906136/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com