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.