diff --git a/src/main/org/apache/tools/ant/util/regexp/JakartaOroMatcher.java b/src/main/org/apache/tools/ant/util/regexp/JakartaOroMatcher.java index dd38c1ee4..7d56c125a 100644 --- a/src/main/org/apache/tools/ant/util/regexp/JakartaOroMatcher.java +++ b/src/main/org/apache/tools/ant/util/regexp/JakartaOroMatcher.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -144,7 +144,12 @@ public class JakartaOroMatcher implements RegexpMatcher { MatchResult mr = matcher.getMatch(); int cnt = mr.groups(); for (int i = 0; i < cnt; i++) { - v.addElement(mr.group(i)); + String match = mr.group(i); + // treat non-matching groups as empty matches + if (match == null) { + match = ""; + } + v.addElement(match); } return v; } diff --git a/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpMatcher.java b/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpMatcher.java index 8c39ed2fe..1a4c52b26 100644 --- a/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpMatcher.java +++ b/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpMatcher.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -133,7 +133,12 @@ public class JakartaRegexpMatcher implements RegexpMatcher { Vector v = new Vector(); int cnt = reg.getParenCount(); for (int i = 0; i < cnt; i++) { - v.addElement(reg.getParen(i)); + String match = reg.getParen(i); + // treat non-matching groups as empty matches + if (match == null) { + match = ""; + } + v.addElement(match); } return v; } diff --git a/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcher.java b/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcher.java index b1cc09432..7beba7464 100644 --- a/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcher.java +++ b/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcher.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2001-2002 The Apache Software Foundation. All rights + * Copyright (c) 2001-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -144,7 +144,12 @@ public class Jdk14RegexpMatcher implements RegexpMatcher { Vector v = new Vector(); int cnt = matcher.groupCount(); for (int i = 0; i <= cnt; i++) { - v.addElement(matcher.group(i)); + String match = matcher.group(i); + // treat non-matching groups as empty matches + if (match == null) { + match = ""; + } + v.addElement(match); } return v; } diff --git a/src/testcases/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java b/src/testcases/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java index 639bee58e..52a557955 100644 --- a/src/testcases/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java +++ b/src/testcases/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -133,6 +133,16 @@ public abstract class RegexpMatcherTest extends TestCase { assertEquals("b", (String) v.elementAt(2)); } + public void testBugzillaReport14619() { + reg.setPattern("^(.*)/src/((.*/)*)([a-zA-Z0-9_\\.]+)\\.java$"); + Vector v = reg.getGroups("de/tom/src/Google.java"); + assertEquals(5, v.size()); + assertEquals("de/tom", v.elementAt(1)); + assertEquals("", v.elementAt(2)); + assertEquals("", v.elementAt(3)); + assertEquals("Google", v.elementAt(4)); + } + public void testCaseInsensitiveMatch() { reg.setPattern("aaaa"); assertTrue("aaaa doesn't match AAaa", !reg.matches("AAaa"));