You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2007/01/04 02:20:30 UTC

svn commit: r492377 - in /jakarta/commons/proper/lang/trunk: RELEASE-NOTES.txt project.xml src/java/org/apache/commons/lang/StringUtils.java src/test/org/apache/commons/lang/StringUtilsSubstringTest.java

Author: scolebourne
Date: Wed Jan  3 17:20:30 2007
New Revision: 492377

URL: http://svn.apache.org/viewvc?view=rev&rev=492377
Log:
LANG-275 - StringUtils substringsBetween, implemented by Dave Meikle

Modified:
    jakarta/commons/proper/lang/trunk/RELEASE-NOTES.txt
    jakarta/commons/proper/lang/trunk/project.xml
    jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
    jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsSubstringTest.java

Modified: jakarta/commons/proper/lang/trunk/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/RELEASE-NOTES.txt?view=diff&rev=492377&r1=492376&r2=492377
==============================================================================
--- jakarta/commons/proper/lang/trunk/RELEASE-NOTES.txt (original)
+++ jakarta/commons/proper/lang/trunk/RELEASE-NOTES.txt Wed Jan  3 17:20:30 2007
@@ -82,4 +82,5 @@
     * [LANG-266] - Wish for StringUtils.join(Collection, *)
     * [LANG-310] - BooleanUtils isNotTrue/isNotFalse
     * [LANG-306] - StrBuilder appendln/appendAll/appendSeparator
+    * [LANG-275] - StringUtils substringsBetween
 

Modified: jakarta/commons/proper/lang/trunk/project.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/project.xml?view=diff&rev=492377&r1=492376&r2=492377
==============================================================================
--- jakarta/commons/proper/lang/trunk/project.xml (original)
+++ jakarta/commons/proper/lang/trunk/project.xml Wed Jan  3 17:20:30 2007
@@ -271,6 +271,9 @@
             <name>Rand McNeely</name>
         </contributor>
         <contributor>
+            <name>Dave Meikle</name>
+        </contributor>
+        <contributor>
             <name>Nikolay Metchev</name>
         </contributor>
         <contributor>

Modified: jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java?view=diff&rev=492377&r1=492376&r2=492377
==============================================================================
--- jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java (original)
+++ jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/StringUtils.java Wed Jan  3 17:20:30 2007
@@ -1859,14 +1859,16 @@
      *
      * <p>A <code>null</code> input String returns <code>null</code>.
      * A <code>null</code> open/close returns <code>null</code> (no match).
-     * An empty ("") open/close returns an empty string.</p>
+     * An empty ("") open and close returns an empty string.</p>
      *
      * <pre>
+     * StringUtils.substringBetween("wx[b]yz", "[", "]") = "b"
      * StringUtils.substringBetween(null, *, *)          = null
+     * StringUtils.substringBetween(*, null, *)          = null
+     * StringUtils.substringBetween(*, *, null)          = null
      * StringUtils.substringBetween("", "", "")          = ""
-     * StringUtils.substringBetween("", "", "tag")       = null
-     * StringUtils.substringBetween("", "tag", "tag")    = null
-     * StringUtils.substringBetween("yabcz", null, null) = null
+     * StringUtils.substringBetween("", "", "]")         = null
+     * StringUtils.substringBetween("", "[", "]")        = null
      * StringUtils.substringBetween("yabcz", "", "")     = ""
      * StringUtils.substringBetween("yabcz", "y", "z")   = "abc"
      * StringUtils.substringBetween("yabczyabcz", "y", "z")   = "abc"
@@ -1890,6 +1892,60 @@
             }
         }
         return null;
+    }
+
+    /**
+     * <p>Searches a String for substrings delimited by a start and end tag,
+     * returning all matching substrings in an array.</p>
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.
+     * A <code>null</code> open/close returns <code>null</code> (no match).
+     * An empty ("") open/close returns <code>null</code> (no match).</p>
+     *
+     * <pre>
+     * StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"]
+     * StringUtils.substringsBetween(null, *, *)            = null
+     * StringUtils.substringsBetween(*, null, *)            = null
+     * StringUtils.substringsBetween(*, *, null)            = null
+     * StringUtils.substringsBetween("", "[", "]")          = []
+     * </pre>
+     *
+     * @param str  the String containing the substrings, null returns null, empty returns empty
+     * @param open  the String identifying the start of the substring, empty returns null
+     * @param close  the String identifying the end of the substring, empty returns null
+     * @return a String Array of substrings, or <code>null</code> if no match
+     * @since 2.3
+     */
+    public static String[] substringsBetween(String str, String open, String close) {
+        if (str == null || isEmpty(open) || isEmpty(close)) {
+            return null;
+        }
+        int strLen = str.length();
+        if (strLen == 0) {
+            return ArrayUtils.EMPTY_STRING_ARRAY;
+        }
+        int closeLen = close.length();
+        int openLen = open.length();
+        List list = new ArrayList();
+        int pos = 0;
+        while (pos < (strLen - closeLen)) {
+            int start = str.indexOf(open, pos);
+            if (start < 0) {
+                break;
+            }
+            start += openLen;
+            int end = str.indexOf(close, start);
+            if (end < 0) {
+                break;
+            }
+            list.add(str.substring(start, end));
+            pos = end + closeLen;
+        }
+        if (list.size() > 0) {
+            return (String[]) list.toArray(new String [list.size()]);
+        } else {
+            return null;
+        }
     }
 
     // Nested extraction

Modified: jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsSubstringTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsSubstringTest.java?view=diff&rev=492377&r1=492376&r2=492377
==============================================================================
--- jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsSubstringTest.java (original)
+++ jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/StringUtilsSubstringTest.java Wed Jan  3 17:20:30 2007
@@ -248,8 +248,71 @@
     public void testSubstringBetween_StringStringString() {
         assertEquals(null, StringUtils.substringBetween(null, "", ""));
         assertEquals("", StringUtils.substringBetween("", "", ""));
+        assertEquals("", StringUtils.substringBetween("foo", "", ""));
+        assertEquals(null, StringUtils.substringBetween("foo", "", "]"));
+        assertEquals(null, StringUtils.substringBetween("foo", "[", "]"));
         assertEquals("", StringUtils.substringBetween("    ", " ", "  "));
         assertEquals("bar", StringUtils.substringBetween("<foo>bar</foo>", "<foo>", "</foo>") );
+    }
+
+   /**
+     * Tests the substringsBetween method that returns an String Array of substrings.
+     */
+    public void testSubstringsBetween_StringStringString() {
+
+        String[] results = StringUtils.substringsBetween("[one], [two], [three]", "[", "]");
+        assertEquals(3, results.length);
+        assertEquals("one", results[0]);
+        assertEquals("two", results[1]);
+        assertEquals("three", results[2]);
+
+        results = StringUtils.substringsBetween("[one], [two], three", "[", "]");
+        assertEquals(2, results.length);
+        assertEquals("one", results[0]);
+        assertEquals("two", results[1]);
+
+        results = StringUtils.substringsBetween("[one], [two], three]", "[", "]");
+        assertEquals(2, results.length);
+        assertEquals("one", results[0]);
+        assertEquals("two", results[1]);
+
+        results = StringUtils.substringsBetween("[one], two], three]", "[", "]");
+        assertEquals(1, results.length);
+        assertEquals("one", results[0]);
+
+        results = StringUtils.substringsBetween("one], two], [three]", "[", "]");
+        assertEquals(1, results.length);
+        assertEquals("three", results[0]);
+
+        // 'ab hello ba' will match, but 'ab non ba' won't
+        // this is because the 'a' is shared between the two and can't be matched twice
+        results = StringUtils.substringsBetween("aabhellobabnonba", "ab", "ba");
+        assertEquals(1, results.length);
+        assertEquals("hello", results[0]);
+
+        results = StringUtils.substringsBetween("one, two, three", "[", "]");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("[one, two, three", "[", "]");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("one, two, three]", "[", "]");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("[one], [two], [three]", "[", null);
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("[one], [two], [three]", null, "]");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("[one], [two], [three]", "", "");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween(null, "[", "]");
+        assertNull(results);
+
+        results = StringUtils.substringsBetween("", "[", "]");
+        assertEquals(0, results.length);
     }
 
     //-----------------------------------------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org