Java regex compare group to string

I am trying to make a replacement using regex. The relevant code snippet looks like this:

String msg ="    <ClientVerificationResult>\n " +
            "      <VerificationIDCheck>Y</VerificationIDCheck>\n" +
            "    </ClientVerificationResult>\n";

String regex = "(<VerificationIDCheck>)([Y|N])(</VerificationIDCheck>)";
String replacedMsg= msg.replaceAll(regex, "$2".matches("Y") ? "$1YES$3" : "$1NO$3") ;
System.out.println(replacedMsg);

      

The result of this

<ClientVerificationResult>
   <VerificationIDCheck>NO</VerificationIDCheck>
</ClientVerificationResult>

      

When should it be

<ClientVerificationResult>
   <VerificationIDCheck>YES</VerificationIDCheck>
</ClientVerificationResult>

      

I think the problem is what "$2".matches("Y")

returns false. I tried to make "$2".equals("Y");

strange combinations inside matches()

like "[Y]"

or "([Y])"

, but still nothing.

If I type "$2"

, the output is Y

. Any hints as to what I am doing wrong?

+3


source to share


2 answers


You cannot use Java code as a replacement argument for replaceAll

, which should only be a string. Better use API Pattern

and Matcher

and evaluate matcher.group(2)

for your replacement logic.

Suggested Code:



String msg ="    <ClientVerificationResult>\n " +
        "      <VerificationIDCheck>Y</VerificationIDCheck>\n" +
        "    </ClientVerificationResult>\n";

String regex = "(<VerificationIDCheck>)([YN])(</VerificationIDCheck>)";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher( msg );
StringBuffer sb = new StringBuffer();
while (m.find()) {
    String repl = m.group(2).matches("Y") ? "YES" : "NO";
    m.appendReplacement(sb, m.group(1) + repl + m.group(3));
}
m.appendTail(sb);
System.out.println(sb); // replaced string

      

+4


source


You check the literal string "$ 2" to see if it matches "Y". It will never happen.



+1


source







All Articles