diff --git a/src/main/java/com/google/code/regexp/Matcher.java b/src/main/java/com/google/code/regexp/Matcher.java index 9b89f7a..9b6b1b1 100644 --- a/src/main/java/com/google/code/regexp/Matcher.java +++ b/src/main/java/com/google/code/regexp/Matcher.java @@ -320,7 +320,9 @@ public List> namedGroups() { } int nextIndex = 0; - while (!matcher.hitEnd() && matcher.find(nextIndex)) { + int lastNextIndex = 0; + matcher.reset(); + while (matcher.find(nextIndex)) { Map matches = new LinkedHashMap(); for (String groupName : groupNames) { @@ -329,6 +331,11 @@ public List> namedGroups() { nextIndex = matcher.end(); } + if (nextIndex == lastNextIndex) { + break; + } + lastNextIndex = nextIndex; + result.add(matches); } return result; diff --git a/src/test/java/com/google/code/regexp/MatcherTest.java b/src/test/java/com/google/code/regexp/MatcherTest.java index 159bb57..032903d 100644 --- a/src/test/java/com/google/code/regexp/MatcherTest.java +++ b/src/test/java/com/google/code/regexp/MatcherTest.java @@ -763,4 +763,17 @@ public void testNamedGroupsReturnsWhenMatchesEmptyString() { assertEquals(1, groups.size()); assertEquals("bar", groups.get(0).get("foo")); } + + // Issue #26 + @Test + public void testNamedGroupsCanBeCalledMultipleTimes() { + final String regex = "/teamDrawer/(?.*)"; + final String url = "/teamDrawer/12345"; + + final Matcher matcher = Pattern.compile(regex).matcher(url); + final Integer count = matcher.namedGroups().size(); + final Integer mapCount = matcher.namedGroups().get(0).size(); + final String value = matcher.namedGroups().get(0).get("roomId"); + assertEquals("12345", value); + } }