From 4f85c164a1a4eeb8813b61cf46132fb91971b323 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 10 Feb 2021 17:04:11 -0500 Subject: [PATCH] Add StringUtils.substringBefore(String, int). --- src/changes/changes.xml | 1 + .../org/apache/commons/lang3/StringUtils.java | 38 +++++++++++++++++++ .../lang3/StringUtilsSubstringTest.java | 20 +++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 490837620..ee60ed429 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -87,6 +87,7 @@ The type attribute can be add,update,fix,remove. Add FailableShortSupplier, handy for JDBC APIs. Add JavaVersion.JAVA_17. Add missing boolean[] join method #686. + Add StringUtils.substringBefore(String, int). Enable Dependabot #587. Bump junit-jupiter from 5.6.2 to 5.7.0. diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java index 478139e37..b5b233d45 100644 --- a/src/main/java/org/apache/commons/lang3/StringUtils.java +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java @@ -8702,6 +8702,44 @@ public static String substringAfterLast(final String str, final String separator return str.substring(pos + separator.length()); } + /** + *

+ * Gets the substring before the first occurrence of a separator. The separator is not returned. + *

+ * + *

+ * A {@code null} string input will return {@code null}. An empty ("") string input will return the empty string. + *

+ * + *

+ * If nothing is found, the string input is returned. + *

+ * + *
+     * StringUtils.substringBefore(null, *)      = null
+     * StringUtils.substringBefore("", *)        = ""
+     * StringUtils.substringBefore("abc", 'a')   = ""
+     * StringUtils.substringBefore("abcba", 'b') = "a"
+     * StringUtils.substringBefore("abc", 'c')   = "ab"
+     * StringUtils.substringBefore("abc", 'd')   = "abc"
+     * 
+ * + * @param str the String to get a substring from, may be null + * @param separator the String to search for, may be null + * @return the substring before the first occurrence of the separator, {@code null} if null String input + * @since 3.12.0 + */ + public static String substringBefore(final String str, final int separator) { + if (isEmpty(str)) { + return str; + } + final int pos = str.indexOf(separator); + if (pos == INDEX_NOT_FOUND) { + return str; + } + return str.substring(0, pos); + } + /** *

Gets the substring before the first occurrence of a separator. * The separator is not returned.

diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java b/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java index d876d7c94..17c69fca6 100644 --- a/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java +++ b/src/test/java/org/apache/commons/lang3/StringUtilsSubstringTest.java @@ -127,7 +127,24 @@ public void testMid_String() { assertEquals(FOO, StringUtils.mid(FOOBAR, -1, 3)); } - //----------------------------------------------------------------------- + @Test + public void testSubstringBefore_StringInt() { + assertEquals("foo", StringUtils.substringBefore("fooXXbarXXbaz", 'X')); + + assertNull(StringUtils.substringBefore(null, 0)); + assertNull(StringUtils.substringBefore(null, 'X')); + assertEquals("", StringUtils.substringBefore("", 0)); + assertEquals("", StringUtils.substringBefore("", 'X')); + + assertEquals("foo", StringUtils.substringBefore("foo", 0)); + assertEquals("foo", StringUtils.substringBefore("foo", 'b')); + assertEquals("f", StringUtils.substringBefore("foot", 'o')); + assertEquals("", StringUtils.substringBefore("abc", 'a')); + assertEquals("a", StringUtils.substringBefore("abcba", 'b')); + assertEquals("ab", StringUtils.substringBefore("abc", 'c')); + assertEquals("abc", StringUtils.substringBefore("abc", 0)); + } + @Test public void testSubstringBefore_StringString() { assertEquals("foo", StringUtils.substringBefore("fooXXbarXXbaz", "XX")); @@ -146,6 +163,7 @@ public void testSubstringBefore_StringString() { assertEquals("a", StringUtils.substringBefore("abcba", "b")); assertEquals("ab", StringUtils.substringBefore("abc", "c")); assertEquals("", StringUtils.substringBefore("abc", "")); + assertEquals("abc", StringUtils.substringBefore("abc", "X")); } @Test