Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用“替换字符串值”;XXXXX";在爪哇?_Java_Regex_String_Replace - Fatal编程技术网

Java 如何用“替换字符串值”;XXXXX";在爪哇?

Java 如何用“替换字符串值”;XXXXX";在爪哇?,java,regex,string,replace,Java,Regex,String,Replace,我想用“XXXX”替换特定的字符串值。问题是模式是非常动态的,输入数据中不会有固定的模式 我的输入数据 我需要将userId和password的值替换为“XXXX” 我的输出应该是- 这是一个一次性的例子。在其他情况下,只有userId和密码存在- userId=12345678&password=stackoverflow&rememberID= 我正在java中使用Regex来实现上述功能,但尚未成功。感谢您的指导 [&]([^\\/?&;]{0,})(userId=|p

我想用“XXXX”替换特定的字符串值。问题是模式是非常动态的,输入数据中不会有固定的模式

我的输入数据

我需要将userId和password的值替换为“XXXX”

我的输出应该是-

这是一个一次性的例子。在其他情况下,只有userId和密码存在-

userId=12345678&password=stackoverflow&rememberID=

我正在java中使用Regex来实现上述功能,但尚未成功。感谢您的指导

[&]([^\\/?&;]{0,})(userId=|password=)=[^&;]+|((?<=\\/)|(?<=\\?)|(?<=;))([^\\/?&;]{0,})(userId=|password=)=[^&]+|(?<=\\?)(userId=|password=)=[^&]+|(userId=|password=)=[^&]+
[&]([^\\/?&;]{0,})(userId=| password=)=[^&;]+|((?使用:


(?这可能涵盖这两种情况


String maskUserNameAndPassword(String input) {
    return input.replaceAll("(userId|password)=[^&]+", "$1=XXXXX");
}

String inputUrl1 = 
    "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

String inputUrl2 = 
    "userId=12345678&password=stackoverflow&rememberID=";

String input = "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

String maskedUrl1 = maskUserNameAndPassword(inputUrl1);
System.out.println("Mask url1: " + maskUserNameAndPassword(inputUrl1));

String maskedUrl2 = maskUserNameAndPassword(inputUrl1);
System.out.println("Mask url2: " + maskUserNameAndPassword(inputUrl2));
上述结果将导致:

Mask url1: https://internetbanking.abc.co.uk/personal/logon/login/?userId=XXXXX&password=XXXXX&reme
Mask url2: userId=XXXXX&password=XXXXX&rememberID=

只需使用String类中的replace/replaceAll方法,它们支持字符集和正则表达式

String url = "https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";

url = url.replaceAll("(userId=.+?&)", "userId=XXXX&");
url = url.replaceAll("(password=.+?&)", "password=XXXX&");

System.out.println(url);
我也不是正则表达式专家,但如果您觉得它有用,我通常使用此网站测试我的表达式,并将其作为在线备忘:


我宁愿使用URL解析器而不是正则表达式。下面的示例使用java中可用的标准URL类,但第三方库可以做得更好

Function<Map.Entry<String, String>, Map.Entry<String, String>> maskUserPasswordEntries = e ->
        (e.getKey().equals("userId") || e.getKey().equals("password")) ? Map.entry(e.getKey(), "XXXX") : e;
Function<List<String>, Map.Entry<String, String>> transformParamsToMap = p ->
        Map.entry(p.get(0), p.size() == 1 ? "" : p.get(p.size() - 1));

URL url = new URL("https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme");
String maskedQuery = Stream.of(url.getQuery().split("&"))
        .map(s -> List.of(s.split("=")))
        .map(transformParamsToMap)
        .map(maskUserPasswordEntries).map(e -> e.getKey() + "=" + e.getValue())
        .collect(Collectors.joining("&"));
System.out.println(url.getProtocol() + "://" + url.getAuthority() + url.getPath() + "?" + maskedQuery);
stringurl=”https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme";
字符串掩码=url.replaceAll(“(用户ID |密码)=[^&]+”,“$1=XXXX”);
见和


请注意,

任何通过GET发送密码的人都应该被解雇。此外,不需要对这些内容进行正则化,只需使用常见的字符串操作,如indexOf和replace。如果密码或用户ID值包含一些URL转义文本怎么办?然后,首先应用URL解码,然后屏蔽用户ID和密码。
java.net.URLD解码(url,StandardCharsets.UTF_8)
然后呢?您在事后重新对其进行URL编码以保持其他值不变?通过更准确的方式更改\w不是更简单吗?此外,如果解码的密码包含@或$之类的字符会怎么样?修复\w一箭双雕是的,最好改进\w以支持特殊字符。找到了@TeWu的道具osed在这里。它可能涵盖了大多数情况,而不是
\w
。但是假设
用户ID
密码
不允许
&
字符在其中。这也将替换类似authorizeduserId=…或类似密码的字符串。@DavidAmar
replaceAll(([?&])(用户ID |密码)=[^&]+,“$1$2=XXXX”
会解决这个问题,但我不确定在这种情况下是否有必要;特别是当您注意到
authorizeduserId
很可能是
authorizeduserId
(注意大写
U
);即使有
authorizeduserId
,也可能是您想要掩盖的东西。不管怎样,捕捉得好-谢谢。
Function<Map.Entry<String, String>, Map.Entry<String, String>> maskUserPasswordEntries = e ->
        (e.getKey().equals("userId") || e.getKey().equals("password")) ? Map.entry(e.getKey(), "XXXX") : e;
Function<List<String>, Map.Entry<String, String>> transformParamsToMap = p ->
        Map.entry(p.get(0), p.size() == 1 ? "" : p.get(p.size() - 1));

URL url = new URL("https://internetbanking.abc.co.uk/personal/logon/login/?userId=Templ3108&password=Got1&reme");
String maskedQuery = Stream.of(url.getQuery().split("&"))
        .map(s -> List.of(s.split("=")))
        .map(transformParamsToMap)
        .map(maskUserPasswordEntries).map(e -> e.getKey() + "=" + e.getValue())
        .collect(Collectors.joining("&"));
System.out.println(url.getProtocol() + "://" + url.getAuthority() + url.getPath() + "?" + maskedQuery);
https://internetbanking.abc.co.uk/personal/logon/login/?userId=XXXX&password=XXXX&reme=