KB Article #178780
String replace filter fails with an exception when a $ is used in the replacement string
Problem
When trying to use the string replace filter with a replacement string containing a dollar sign character, an exception like the following is observed in the trace:
java exception: java.lang.IllegalArgumentException: Illegal group reference at java.util.regex.Matcher.appendReplacement(Matcher.java:857) at java.util.regex.Matcher.replaceFirst(Matcher.java:1004) at java.lang.String.replaceFirst(String.java:2178) at com.vordel.circuit.string.StringReplaceProcessor.invoke(StringReplaceProcessor.java:77) at com.vordel.circuit.InvocationEngine.invokeFilter(InvocationEngine.java:151) at com.vordel.circuit.InvocationEngine.invokeCircuit(InvocationEngine.java:43) at com.vordel.circuit.InvocationEngine.recordCircuitInvocation(InvocationEngine.java:278) at com.vordel.circuit.InvocationEngine.processMessage(InvocationEngine.java:241) at com.vordel.circuit.SyntheticCircuitChainProcessor.invoke(SyntheticCircuitChainProcessor.java:65) at com.vordel.dwe.http.HTTPPlugin.processRequest(HTTPPlugin.java:432) at com.vordel.dwe.http.HTTPPlugin.invokeDispose(HTTPPlugin.java:451) at com.vordel.dwe.http.HTTPPlugin.invoke(HTTPPlugin.java:144)
Resolution
Dollar sign $ characters used in the replacement string must be escaped as \$ when a literal dollar sign is intended. This is because the dollar sign would otherwise be interpreted as either a JUEL selector expression like ${my.variable} or a reference to a Java regex capture group like $1 or $2 which are valid in the replacement string.