diff --git a/java/com/google/re2j/Pattern.java b/java/com/google/re2j/Pattern.java index dfe1bf18..b6831883 100644 --- a/java/com/google/re2j/Pattern.java +++ b/java/com/google/re2j/Pattern.java @@ -272,7 +272,7 @@ private String[] split(Matcher m, int limit) { result.add(m.substring(last, m.inputLength())); } - if (limit != 0 || result.isEmpty()) { + if (limit != 0 || (result.isEmpty() && !(last == m.inputLength() && last > 0))) { result.add(m.substring(last, m.inputLength())); } diff --git a/javatests/com/google/re2j/PatternTest.java b/javatests/com/google/re2j/PatternTest.java index 8a4f897f..c21b8d2d 100644 --- a/javatests/com/google/re2j/PatternTest.java +++ b/javatests/com/google/re2j/PatternTest.java @@ -162,6 +162,13 @@ public void testSplit() { ApiTestUtils.testSplit("x*", "foo", 1, new String[] {"foo"}); ApiTestUtils.testSplit("x*", "f", 2, new String[] {"f", ""}); ApiTestUtils.testSplit(":", ":a::b", new String[] {"", "a", "", "b"}); + + // From https://github.com/google/re2j/issues/197. + // Test split when input is fully matched and limit is 0. + ApiTestUtils.testSplit("\\s+", " ", new String[] {}); + ApiTestUtils.testSplit("\\s+", " foo", new String[] {"", "foo"}); + ApiTestUtils.testSplit("\\s+", "foo ", new String[] {"foo"}); + ApiTestUtils.testSplit("\\s+", "", new String[] {""}); } @Test