在Java中查找和替换字符串模式

3
我使用正则表达式和字符串 replaceFirst 来替换以下模式。
String xml = "<param>otpcode=1234567</param><param>password=abc123</param>";


if(xml.contains("otpcode")){
    Pattern regex = Pattern.compile("<param>otpcode=(.*)</param>");
    Matcher matcher = regex.matcher(xml);
    if (matcher.find()) {
        xml = xml.replaceFirst("<param>otpcode=" + matcher.group(1)+ "</param>","<param>otpcode=xxxx</param>");
    }
}
System.out.println(xml);

if (xml.contains("password")) {
    Pattern regex = Pattern.compile("<param>password=(.*)</param>");
    Matcher matcher = regex.matcher(xml);
    if (matcher.find()) {
            xml = xml.replaceFirst("<param>password=" + matcher.group(1)+ "</param>","<param>password=xxxx</param>");
    }
}
System.out.println(xml);

期望的输出结果

<param>otpcode=xxxx</param><param>password=abc123</param>
<param>otpcode=xxxx</param><param>password=xxxx</param>

实际输出(在第一个IF语句中一次性替换整个字符串)
<param>otpcode=xxxx</param>
<param>otpcode=xxxx</param>
1个回答

4

你需要使用非贪婪正则表达式:

<param>otpcode=(.*?)</param>
<param>password=(.*?)</param>

这将匹配到第一个</param>而不是最后一个...

@jackk - 验证了答案并发现如预期。 - RedGuts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接