From: David Corbett Date: Mon, 10 Sep 2018 22:19:10 +0000 (-0400) Subject: ICU-12979 Fix \Q...\E in UnicodeRegex#transform (#23) X-Git-Tag: release-63-rc~80 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=378b04c1b2e715645bdee1edb7dd55775ca9ef22;p=icu ICU-12979 Fix \Q...\E in UnicodeRegex#transform (#23) --- diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/UnicodeRegex.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/UnicodeRegex.java index fb7a0c0df30..ccaa6077cca 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/UnicodeRegex.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/UnicodeRegex.java @@ -116,7 +116,7 @@ public class UnicodeRegex implements Cloneable, Freezable, StringT case 1: // we are after a \ if (ch == 'Q') { - state = 1; + state = 2; } else { state = 0; } @@ -128,11 +128,12 @@ public class UnicodeRegex implements Cloneable, Freezable, StringT } break; - case 3: // we are in at \Q...\ + case 3: // we are in a \Q...\ if (ch == 'E') { state = 0; + } else if (ch != '\\') { + state = 2; } - state = 2; break; } result.append(ch); diff --git a/icu4j/main/tests/translit/src/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java b/icu4j/main/tests/translit/src/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java index 5ce5d411e44..429086971c8 100644 --- a/icu4j/main/tests/translit/src/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java +++ b/icu4j/main/tests/translit/src/com/ibm/icu/dev/test/translit/RegexUtilitiesTest.java @@ -216,6 +216,29 @@ public class RegexUtilitiesTest extends TestFmwk { } } + /** + * Check {@code \Q} and {@code \E}. + */ + @Test + public void TestTransformQuotation() { + String[][] tests = { + {"a\\Qb", "a\\Qb"}, + {"a\\Eb", "a\\Eb"}, + {"\\Q[ba]", "\\Q[ba]"}, + {"\\\\Q[ba]", "\\\\Q[ab]"}, + {"\\Q[ba]\\e[ba]", "\\Q[ba]\\e[ba]"}, + {"\\Q[ba]\\E[ba]", "\\Q[ba]\\E[ab]"}, + {"\\Q[ba]\\\\E[ba]", "\\Q[ba]\\\\E[ab]"}, + }; + UnicodeRegex regex = new UnicodeRegex(); + for (int i = 0; i < tests.length; ++i) { + final String source = tests[i][0]; + String expected = tests[i][1]; + String actual = regex.transform(source); + assertEquals(source, expected, actual); + } + } + /** * Utility for checking patterns */