Search code examples
javaregexnewlinereplaceall

Using regex on XML, avoid greedy match


It looks simple problem , but I'll apprisiate any help here :

I need to swap password value (can be any value) to "****"

The origunal sting is string resived from xml

The problem is that I getting as output only line:

         <parameter><value>*****</value></parameter>

But I need the whole string as output only with password value replaced

Thank you in advance

        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();  

Solution

  • If I'm not mistaken, you want to change the password in the string with *'s. You can do it by using String methods directly. Just get the last index of the starting value tag and iterate until you reach a "<", replacing the value between those two with *'s. Something like this:

    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] = '*';
        }
    }
    

    EDIT: There is another way making a proper use of all the String class goodies:

    int from = originalString.lastIndexOf("<name>password</name><value>");
    int to = originalString.indexOf("</value>", from);
    Arrays.fill(originalString.toCharArray(), from, to, '*');