Re-add String.replace(CharSequence,CharSequence) with proper quoting on the
replacement string.
Patch by: jat
Review by: spoon (desk review)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2203 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 92b2f45..f219c30 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -555,12 +555,15 @@
}-*/;
// TODO(jat): fails on Safari 2 -- to be fixed for 1.5RC1
-// public String replace(CharSequence from, CharSequence to) {
-// // Escape regex special characters from literal replacement string.
-// String regex = from.toString().replaceAll("([/\\\\\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}])",
-// "\\\\$1");
-// return replaceAll(regex, to.toString());
-// }
+ public String replace(CharSequence from, CharSequence to) {
+ // Escape regex special characters from literal replacement string.
+ String regex = from.toString().replaceAll("([/\\\\\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}])",
+ "\\\\$1");
+ // Escape $ since it is for match backrefs and \ since it is used to escape $.
+ String replacement = to.toString().replaceAll("\\\\", "\\\\\\\\").replaceAll("\\$",
+ "\\\\$");
+ return replaceAll(regex, replacement);
+ }
/**
* Regular expressions vary from the standard implementation. The
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 48dcb5c..dbd2aa8 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -326,15 +326,15 @@
assertEquals("dog food", dogFood.replace('\u0120', ' '));
String testStr = String.valueOf(new char[] {'\u1111', 'B', '\u1111', 'B', '\u1111', 'B'});
assertEquals("ABABAB", testStr.replace('\u1111', 'A'));
-// assertEquals("foobar", hideFromCompiler("bazbar").replace("baz", "foo"));
-// assertEquals("$0bar", hideFromCompiler("foobar").replace("foo", "$0"));
-// assertEquals("+1", hideFromCompiler("*[)1").replace("*[)", "+"));
}
public void testReplaceAll() {
String regex = hideFromCompiler("*[").replaceAll("([/\\\\\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}])",
"\\\\$1");
assertEquals("\\*\\[", regex);
+ String replacement = hideFromCompiler("\\").replaceAll("\\\\", "\\\\\\\\").replaceAll("\\$",
+ "\\\\$");
+ assertEquals("\\\\", replacement);
assertEquals("+1", hideFromCompiler("*[1").replaceAll(regex, "+"));
String x1 = String.valueOf(new char[] {'x', 'x', 'x', 'a', 'b', 'c', 'x', 'x', 'd', 'e', 'x',
'f'});
@@ -374,6 +374,14 @@
"boo", "and", "foo"});
}
+ public void testReplaceString() {
+ assertEquals("foobar", hideFromCompiler("bazbar").replace("baz", "foo"));
+ assertEquals("$0bar", hideFromCompiler("foobar").replace("foo", "$0"));
+ assertEquals("$1bar", hideFromCompiler("foobar").replace("foo", "$1"));
+ assertEquals("\\$1bar", hideFromCompiler("foobar").replace("foo", "\\$1"));
+ assertEquals("\\1", hideFromCompiler("*[)1").replace("*[)", "\\"));
+ }
+
public void testStartsWith() {
String haystack = "abcdefghi";
assertTrue(haystack.startsWith("abc"));