Jim White
2009-01-03 04:11:14 UTC
Before I open a JIRA and wind up in another lengthy debate, is there
anyone who wants to defend that String.replaceAll(String, Closure) is
passing the stringified closure result to Matcher.appendReplacement?
The consequence is that the resulting string is interpreted as a
"replacement string" which treats '$' and '\' specially so that group
replacements can be done. For my purposes that definitely undesireable.
The whole reason I see for the closure API is so that those
substitutions are done in the closure and that the closure expects it's
result string to be substituted literally.
An example of the problem is like this:
groovy> println 'x123z45'.replaceAll(/([^z]*)(z)/, { all, m, d -> m })
x12345
groovy> println '$123z45'.replaceAll(/([^z]*)(z)/, { all, m, d -> m })
$1232345
The fix is that quoteReplacement needs to be called on the result before
appendReplacement is called. This is similar to the problem we had with
minus.
http://jira.codehaus.org/browse/GROOVY-1637
Hmmm, there they avoided the problem that quoteReplacement is JDK 1.5 by
not using replaceAll. Looks like we need to implement
RegexUtils.quoteReplacement after all.
Jim
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
anyone who wants to defend that String.replaceAll(String, Closure) is
passing the stringified closure result to Matcher.appendReplacement?
The consequence is that the resulting string is interpreted as a
"replacement string" which treats '$' and '\' specially so that group
replacements can be done. For my purposes that definitely undesireable.
The whole reason I see for the closure API is so that those
substitutions are done in the closure and that the closure expects it's
result string to be substituted literally.
An example of the problem is like this:
groovy> println 'x123z45'.replaceAll(/([^z]*)(z)/, { all, m, d -> m })
x12345
groovy> println '$123z45'.replaceAll(/([^z]*)(z)/, { all, m, d -> m })
$1232345
The fix is that quoteReplacement needs to be called on the result before
appendReplacement is called. This is similar to the problem we had with
minus.
http://jira.codehaus.org/browse/GROOVY-1637
Hmmm, there they avoided the problem that quoteReplacement is JDK 1.5 by
not using replaceAll. Looks like we need to implement
RegexUtils.quoteReplacement after all.
Jim
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email