Author: Manuel Carrasco MoƱino <manuel.carrasco.m@gmail.com> Fixing edge cases in String.matches() broken when using choices in the regex Change-Id: I8e178deda88b0425e10e8dc84fcd582b19c3b1c7 Review-Link: https://gwt-review.googlesource.com/#/c/1100/ Review by: skybrian@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11365 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 032e04c..6fab967 100644 --- a/user/super/com/google/gwt/emul/java/lang/String.java +++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -764,10 +764,9 @@ * TODO(jat): properly handle Java regex syntax */ public native boolean matches(String regex) /*-{ - var matchObj = new RegExp(regex).exec(this); - // if there is no match at all, matchObj will be null - // matchObj[0] is the entire matched string - return (matchObj == null) ? false : (this == matchObj[0]); + // We surround the regex with '^' and '$' because it must match + // the entire string. + return new RegExp('^(' + regex + ')$').test(this); }-*/; public int offsetByCodePoints(int index, int codePointOffset) {
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 2266c08..07b4ebb 100644 --- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -424,18 +424,27 @@ assertEquals("", "".toLowerCase()); } - /* - * TODO: needs rewriting to avoid compiler optimizations. - */ public void testMatch() { - assertFalse("1f", "abbbbcd".matches("b*")); - assertFalse("2f", "abbbbcd".matches("b+")); - assertTrue("3t", "abbbbcd".matches("ab*bcd")); - assertTrue("4t", "abbbbcd".matches("ab+cd")); - assertTrue("5t", "abbbbcd".matches("ab+bcd")); - assertFalse("6f", "abbbbcd".matches("")); - assertTrue("7t", "abbbbcd".matches("a.*d")); - assertFalse("8f", "abbbbcd".matches("a.*e")); + assertFalse("1f", hideFromCompiler("abbbbcd").matches("b*")); + assertFalse("2f", hideFromCompiler("abbbbcd").matches("b+")); + assertTrue("3t", hideFromCompiler("abbbbcd").matches("ab*bcd")); + assertTrue("4t", hideFromCompiler("abbbbcd").matches("ab+cd")); + assertTrue("5t", hideFromCompiler("abbbbcd").matches("ab+bcd")); + assertFalse("6f", hideFromCompiler("abbbbcd").matches("")); + assertTrue("7t", hideFromCompiler("abbbbcd").matches("a.*d")); + assertFalse("8f", hideFromCompiler("abbbbcd").matches("a.*e")); + // issue #7736 + assertTrue("9t.1", hideFromCompiler("").matches("(|none)")); + assertTrue("9t.2", hideFromCompiler("none").matches("(|none)")); + assertFalse("9f.1", hideFromCompiler("ab").matches("(|none)")); + assertFalse("9f.2", hideFromCompiler("anoneb").matches("(|none)")); + assertTrue("10t", hideFromCompiler("none").matches("^(|none)$")); + assertFalse("10f", hideFromCompiler("abbbbcd").matches("^b*$")); + assertTrue("11t.1", hideFromCompiler("").matches("|none")); + assertTrue("11t.2", hideFromCompiler("none").matches("|none")); + assertFalse("11f.1", hideFromCompiler("ab").matches("|none")); + assertFalse("11f.2", hideFromCompiler("anoneb").matches("|none")); + assertTrue("12t", hideFromCompiler("none").matches("^|none$")); } /*