Java 在XML上使用正则表达式,避免贪婪匹配

Java 在XML上使用正则表达式,避免贪婪匹配,java,regex,newline,replaceall,Java,Regex,Newline,Replaceall,这个问题看起来很简单,但我会在这里感谢您的帮助: 我需要交换密码值,可以是任何值**** 原始sting是从xml中调整大小的字符串 问题是我得到的是仅作为输出的行: <parameter><value>*****</value></parameter> 但我需要整个字符串作为输出,只替换密码值 先谢谢你 String originalString = "<parameter>" +

这个问题看起来很简单,但我会在这里感谢您的帮助:

我需要交换密码值,可以是任何值****

原始sting是从xml中调整大小的字符串

问题是我得到的是仅作为输出的行:

         <parameter><value>*****</value></parameter>
但我需要整个字符串作为输出,只替换密码值

先谢谢你

        String originalString = "<parameter>" +
            "<name>password</name>"+
            "<value>my123pass</value>"+
            "</parameter>"+
            "<parameter>"+
            "<name>LoginAttempt</name>"+
            "<value>1</value>"+
            "</parameter>";
    System.out.println("originalString: "+originalString);                         
    Pattern pat = Pattern.compile("<name>password</name><value>.*</value>");
    Matcher mat = pat.matcher(originalString);

    System.out.println("NewString: ");
    System.out.print(mat.replaceFirst("<value>***</value>"));
    mat.reset();  

如果我没弄错的话,您想用*更改字符串中的密码。您可以直接使用字符串方法来实现这一点。只需获取起始值标记的最后一个索引并进行迭代,直到达到一个使用正则表达式破坏XML的目的,这通常只会让您落泪。话虽如此,您的问题是。*是贪婪的,因此它匹配所有内容,直到字符串中的最后一个。这就是为什么尝试使用正则表达式通常是个坏主意的原因之一。所以在星号后面加一个问号:*?看看你是否满意。这就把贪婪变成了不情愿的行为。你的标题有误导性,因为它提到了新行,而你的问题中没有新行。编辑它。由于它是一个类似XML的字符串,请尝试使用dom或sax解析器,就像它只是正则表达式的语法一样..*匹配贪婪;*?火柴不吉利。你的问题就像在问“如何做出贪婪的行为?”这只是惯例/语法。
int from = originalString.lastIndexOf("<name>password</name><value>");
bool endIteration = false;
for(i = from + 1 ; i < originalString.length() && !endIteration ; i ++) {
    if(originalString.toCharArray()[i] == '<')
        endIteration = true;
    else {
        originalString.toCharArray()[i] = '*';
    }
}
int from = originalString.lastIndexOf("<name>password</name><value>");
int to = originalString.indexOf("</value>", from);
Arrays.fill(originalString.toCharArray(), from, to, '*');