From 4fa9794d06fa92188895883a1dae020b01fb0e2e Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 15 Nov 2020 00:50:25 +0800 Subject: [PATCH] fix bug --- CHANGELOG.md | 1 + .../java/cn/hutool/core/util/StrUtil.java | 35 +++++++++---------- .../java/cn/hutool/core/util/StrUtilTest.java | 17 +++++++-- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58d538385..6f02357ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ * 【http 】 修复Snowflake时间回拨导致ID重复的bug(issue#1206@Github) * 【core 】 修复StrUtil.lastIndexOf查找位于首位的字符串找不到的bug(issue#I24RSV@Gitee) * 【poi 】 修复BigExcelWriter的autoSizeColumnAll问题(pr#1221@Github) +* 【core 】 修复StrUtil.subBetweenAll不支持相同字符的问题(pr#1217@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index 2b61b7a5e..cb4cb4b85 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -2405,10 +2405,19 @@ public class StrUtil { } final List result = new LinkedList<>(); - for (String fragment : split(str, prefix)) { - int suffixIndex = fragment.indexOf(suffix.toString()); - if (suffixIndex > 0) { - result.add(fragment.substring(0, suffixIndex)); + final String[] split = split(str, prefix); + if(prefix.equals(suffix)){ + // 前后缀字符相同,单独处理 + for (int i = 1, length = split.length - 1; i < length; i += 2) { + result.add(split[i]); + } + } else{ + int suffixIndex; + for (String fragment : split) { + suffixIndex = fragment.indexOf(suffix.toString()); + if (suffixIndex > 0) { + result.add(fragment.substring(0, suffixIndex)); + } } } @@ -2433,23 +2442,13 @@ public class StrUtil { * * * @param str 被切割的字符串 - * @param beforeAndAfter 截取开始和结束的字符串标识 + * @param prefixAndSuffix 截取开始和结束的字符串标识 * @return 截取后的字符串 * @author gotanks - * @since 5.4.7 + * @since 5.5.0 */ - public static String[] subBetweenAll(CharSequence str, CharSequence beforeAndAfter) { - String[] resultArr = new String[0]; - if (hasEmpty(str, beforeAndAfter) || !contains(str, beforeAndAfter)) { - return resultArr; - } - - final List result = new LinkedList<>(); - String[] split = split(str, beforeAndAfter); - for (int i = 1, length = split.length - 1; i < length; i = i + 2) { - result.add(split[i]); - } - return result.toArray(resultArr); + public static String[] subBetweenAll(CharSequence str, CharSequence prefixAndSuffix) { + return subBetweenAll(str, prefixAndSuffix, prefixAndSuffix); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index 8cbdb7eb2..3a162786b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -1,6 +1,5 @@ package cn.hutool.core.util; -import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Dict; import org.junit.Assert; import org.junit.Test; @@ -437,9 +436,21 @@ public class StrUtilTest { @Test public void subBetweenAllTest3() { String src1 = "'abc'and'123'"; + String[] strings = StrUtil.subBetweenAll(src1, "'", "'"); + Assert.assertEquals(2, strings.length); + Assert.assertEquals("abc", strings[0]); + Assert.assertEquals("123", strings[1]); - final String[] strings = StrUtil.subBetweenAll(src1, "'", "'"); - Console.log(strings); + String src2 = "'abc''123'"; + strings = StrUtil.subBetweenAll(src2, "'", "'"); + Assert.assertEquals(2, strings.length); + Assert.assertEquals("abc", strings[0]); + Assert.assertEquals("123", strings[1]); + + String src3 = "'abc'123'"; + strings = StrUtil.subBetweenAll(src3, "'", "'"); + Assert.assertEquals(1, strings.length); + Assert.assertEquals("abc", strings[0]); } @Test