修复StrUtil.subWithLength负数问题

This commit is contained in:
Looly 2022-11-03 23:17:06 +08:00
parent a48e79b03f
commit 9234846eb7
3 changed files with 84 additions and 70 deletions

View File

@ -16,6 +16,7 @@
* 【core 】 由于对于ASCII的编码解码有缺陷且这种BCD实现并不规范因此BCD标记为弃用issue#I5XEC6@Gitee * 【core 】 由于对于ASCII的编码解码有缺陷且这种BCD实现并不规范因此BCD标记为弃用issue#I5XEC6@Gitee
* 【core 】 修复IoUtil.copyByNIO方法写出时没有flush的问题 * 【core 】 修复IoUtil.copyByNIO方法写出时没有flush的问题
* 【core 】 修复TreeBuilder中使用HashMap导致默认乱序问题issue#I5Z8C5@Gitee * 【core 】 修复TreeBuilder中使用HashMap导致默认乱序问题issue#I5Z8C5@Gitee
* 【core 】 修复StrUtil.subWithLength负数问题issue#I5YN49@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.9 (2022-10-22) # 5.8.9 (2022-10-22)

View File

@ -2132,15 +2132,22 @@ public class CharSequenceUtil {
/** /**
* 截取字符串,从指定位置开始,截取指定长度的字符串<br> * 截取字符串,从指定位置开始,截取指定长度的字符串<br>
* author weibaohui * 如果fromIndex为正数则向后截取指定length长度如果为负数则向前截取length长度
* *
* @param input 原始字符串 * @param input 原始字符串
* @param fromIndex 开始的index,包括 * @param fromIndex 开始的index,包括
* @param length 要截取的长度 * @param length 要截取的长度
* @return 截取后的字符串 * @return 截取后的字符串
* @author weibaohui
*/ */
public static String subWithLength(String input, int fromIndex, int length) { public static String subWithLength(String input, int fromIndex, int length) {
return sub(input, fromIndex, fromIndex + length); final int toIndex;
if(fromIndex < 0){
toIndex = fromIndex - length;
}else{
toIndex = fromIndex + length;
}
return sub(input, fromIndex, toIndex);
} }
/** /**

View File

@ -15,14 +15,14 @@ public class StrUtilTest {
@Test @Test
public void isBlankTest() { public void isBlankTest() {
String blank = "   "; final String blank = "   ";
Assert.assertTrue(StrUtil.isBlank(blank)); Assert.assertTrue(StrUtil.isBlank(blank));
} }
@Test @Test
public void trimTest() { public void trimTest() {
String blank = " 哈哈  "; final String blank = " 哈哈  ";
String trim = StrUtil.trim(blank); final String trim = StrUtil.trim(blank);
Assert.assertEquals("哈哈", trim); Assert.assertEquals("哈哈", trim);
} }
@ -40,29 +40,29 @@ public class StrUtilTest {
@Test @Test
public void trimTabTest() { public void trimTabTest() {
String str = "\taaa"; final String str = "\taaa";
Assert.assertEquals("aaa", StrUtil.trim(str)); Assert.assertEquals("aaa", StrUtil.trim(str));
} }
@Test @Test
public void cleanBlankTest() { public void cleanBlankTest() {
// 包含制表符英文空格不间断空白符全角空格 // 包含制表符英文空格不间断空白符全角空格
String str = " 你 好 "; final String str = " 你 好 ";
String cleanBlank = StrUtil.cleanBlank(str); final String cleanBlank = StrUtil.cleanBlank(str);
Assert.assertEquals("你好", cleanBlank); Assert.assertEquals("你好", cleanBlank);
} }
@Test @Test
public void cutTest() { public void cutTest() {
String str = "aaabbbcccdddaadfdfsdfsdf0"; final String str = "aaabbbcccdddaadfdfsdfsdf0";
String[] cut = StrUtil.cut(str, 4); final String[] cut = StrUtil.cut(str, 4);
Assert.assertArrayEquals(new String[]{"aaab", "bbcc", "cddd", "aadf", "dfsd", "fsdf", "0"}, cut); Assert.assertArrayEquals(new String[]{"aaab", "bbcc", "cddd", "aadf", "dfsd", "fsdf", "0"}, cut);
} }
@Test @Test
public void splitTest() { public void splitTest() {
String str = "a,b ,c,d,,e"; final String str = "a,b ,c,d,,e";
List<String> split = StrUtil.split(str, ',', -1, true, true); final List<String> split = StrUtil.split(str, ',', -1, true, true);
// 测试空是否被去掉 // 测试空是否被去掉
Assert.assertEquals(5, split.size()); Assert.assertEquals(5, split.size());
// 测试去掉两边空白符是否生效 // 测试去掉两边空白符是否生效
@ -74,16 +74,16 @@ public class StrUtilTest {
@Test @Test
public void splitEmptyTest() { public void splitEmptyTest() {
String str = ""; final String str = "";
List<String> split = StrUtil.split(str, ',', -1, true, true); final List<String> split = StrUtil.split(str, ',', -1, true, true);
// 测试空是否被去掉 // 测试空是否被去掉
Assert.assertEquals(0, split.size()); Assert.assertEquals(0, split.size());
} }
@Test @Test
public void splitTest2() { public void splitTest2() {
String str = "a.b."; final String str = "a.b.";
List<String> split = StrUtil.split(str, '.'); final List<String> split = StrUtil.split(str, '.');
Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.size());
Assert.assertEquals("b", split.get(1)); Assert.assertEquals("b", split.get(1));
Assert.assertEquals("", split.get(2)); Assert.assertEquals("", split.get(2));
@ -101,7 +101,7 @@ public class StrUtilTest {
@Test @Test
public void splitToLongTest() { public void splitToLongTest() {
String str = "1,2,3,4, 5"; final String str = "1,2,3,4, 5";
long[] longArray = StrUtil.splitToLong(str, ','); long[] longArray = StrUtil.splitToLong(str, ',');
Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray); Assert.assertArrayEquals(new long[]{1, 2, 3, 4, 5}, longArray);
@ -111,7 +111,7 @@ public class StrUtilTest {
@Test @Test
public void splitToIntTest() { public void splitToIntTest() {
String str = "1,2,3,4, 5"; final String str = "1,2,3,4, 5";
int[] intArray = StrUtil.splitToInt(str, ','); int[] intArray = StrUtil.splitToInt(str, ',');
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray); Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intArray);
@ -121,11 +121,11 @@ public class StrUtilTest {
@Test @Test
public void formatTest() { public void formatTest() {
String template = "你好,我是{name},我的电话是:{phone}"; final String template = "你好,我是{name},我的电话是:{phone}";
String result = StrUtil.format(template, Dict.create().set("name", "张三").set("phone", "13888881111")); final String result = StrUtil.format(template, Dict.create().set("name", "张三").set("phone", "13888881111"));
Assert.assertEquals("你好我是张三我的电话是13888881111", result); Assert.assertEquals("你好我是张三我的电话是13888881111", result);
String result2 = StrUtil.format(template, Dict.create().set("name", "张三").set("phone", null)); final String result2 = StrUtil.format(template, Dict.create().set("name", "张三").set("phone", null));
Assert.assertEquals("你好,我是张三,我的电话是:{phone}", result2); Assert.assertEquals("你好,我是张三,我的电话是:{phone}", result2);
} }
@ -191,8 +191,8 @@ public class StrUtilTest {
@Test @Test
public void lastIndexOfTest() { public void lastIndexOfTest() {
String a = "aabbccddcc"; final String a = "aabbccddcc";
int lastIndexOf = StrUtil.lastIndexOf(a, "c", 0, false); final int lastIndexOf = StrUtil.lastIndexOf(a, "c", 0, false);
Assert.assertEquals(-1, lastIndexOf); Assert.assertEquals(-1, lastIndexOf);
} }
@ -222,76 +222,76 @@ public class StrUtilTest {
@Test @Test
public void replaceTest2() { public void replaceTest2() {
String result = StrUtil.replace("123", "2", "3"); final String result = StrUtil.replace("123", "2", "3");
Assert.assertEquals("133", result); Assert.assertEquals("133", result);
} }
@Test @Test
public void replaceTest3() { public void replaceTest3() {
String result = StrUtil.replace(",abcdef,", ",", "|"); final String result = StrUtil.replace(",abcdef,", ",", "|");
Assert.assertEquals("|abcdef|", result); Assert.assertEquals("|abcdef|", result);
} }
@Test @Test
public void replaceTest4() { public void replaceTest4() {
String a = "1039"; final String a = "1039";
String result = StrUtil.padPre(a, 8, "0"); //在字符串1039前补4个0 final String result = StrUtil.padPre(a, 8, "0"); //在字符串1039前补4个0
Assert.assertEquals("00001039", result); Assert.assertEquals("00001039", result);
String aa = "1039"; final String aa = "1039";
String result1 = StrUtil.padPre(aa, -1, "0"); //在字符串1039前补4个0 final String result1 = StrUtil.padPre(aa, -1, "0"); //在字符串1039前补4个0
Assert.assertEquals("103", result1); Assert.assertEquals("103", result1);
} }
@Test @Test
public void replaceTest5() { public void replaceTest5() {
String a = "\uD853\uDC09秀秀"; final String a = "\uD853\uDC09秀秀";
String result = StrUtil.replace(a, 1, a.length(), '*'); final String result = StrUtil.replace(a, 1, a.length(), '*');
Assert.assertEquals("\uD853\uDC09**", result); Assert.assertEquals("\uD853\uDC09**", result);
String aa = "规划大师"; final String aa = "规划大师";
String result1 = StrUtil.replace(aa, 2, a.length(), '*'); final String result1 = StrUtil.replace(aa, 2, a.length(), '*');
Assert.assertEquals("规划**", result1); Assert.assertEquals("规划**", result1);
} }
@Test @Test
public void upperFirstTest() { public void upperFirstTest() {
StringBuilder sb = new StringBuilder("KEY"); final StringBuilder sb = new StringBuilder("KEY");
String s = StrUtil.upperFirst(sb); final String s = StrUtil.upperFirst(sb);
Assert.assertEquals(s, sb.toString()); Assert.assertEquals(s, sb.toString());
} }
@Test @Test
public void lowerFirstTest() { public void lowerFirstTest() {
StringBuilder sb = new StringBuilder("KEY"); final StringBuilder sb = new StringBuilder("KEY");
String s = StrUtil.lowerFirst(sb); final String s = StrUtil.lowerFirst(sb);
Assert.assertEquals("kEY", s); Assert.assertEquals("kEY", s);
} }
@Test @Test
public void subTest() { public void subTest() {
String a = "abcderghigh"; final String a = "abcderghigh";
String pre = StrUtil.sub(a, -5, a.length()); final String pre = StrUtil.sub(a, -5, a.length());
Assert.assertEquals("ghigh", pre); Assert.assertEquals("ghigh", pre);
} }
@Test @Test
public void subByCodePointTest() { public void subByCodePointTest() {
// 🤔👍🍓🤔 // 🤔👍🍓🤔
String test = "\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53\uD83E\uDD14"; final String test = "\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53\uD83E\uDD14";
// 不正确的子字符串 // 不正确的子字符串
String wrongAnswer = StrUtil.sub(test, 0, 3); final String wrongAnswer = StrUtil.sub(test, 0, 3);
Assert.assertNotEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", wrongAnswer); Assert.assertNotEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", wrongAnswer);
// 正确的子字符串 // 正确的子字符串
String rightAnswer = StrUtil.subByCodePoint(test, 0, 3); final String rightAnswer = StrUtil.subByCodePoint(test, 0, 3);
Assert.assertEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", rightAnswer); Assert.assertEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", rightAnswer);
} }
@Test @Test
public void subBeforeTest() { public void subBeforeTest() {
String a = "abcderghigh"; final String a = "abcderghigh";
String pre = StrUtil.subBefore(a, "d", false); String pre = StrUtil.subBefore(a, "d", false);
Assert.assertEquals("abc", pre); Assert.assertEquals("abc", pre);
pre = StrUtil.subBefore(a, 'd', false); pre = StrUtil.subBefore(a, 'd', false);
@ -308,7 +308,7 @@ public class StrUtilTest {
@Test @Test
public void subAfterTest() { public void subAfterTest() {
String a = "abcderghigh"; final String a = "abcderghigh";
String pre = StrUtil.subAfter(a, "d", false); String pre = StrUtil.subAfter(a, "d", false);
Assert.assertEquals("erghigh", pre); Assert.assertEquals("erghigh", pre);
pre = StrUtil.subAfter(a, 'd', false); pre = StrUtil.subAfter(a, 'd', false);
@ -346,7 +346,7 @@ public class StrUtilTest {
@Test @Test
public void moveTest() { public void moveTest() {
String str = "aaaaaaa22222bbbbbbb"; final String str = "aaaaaaa22222bbbbbbb";
String result = StrUtil.move(str, 7, 12, -3); String result = StrUtil.move(str, 7, 12, -3);
Assert.assertEquals("aaaa22222aaabbbbbbb", result); Assert.assertEquals("aaaa22222aaabbbbbbb", result);
result = StrUtil.move(str, 7, 12, -4); result = StrUtil.move(str, 7, 12, -4);
@ -369,7 +369,7 @@ public class StrUtilTest {
@Test @Test
public void removePrefixIgnorecaseTest() { public void removePrefixIgnorecaseTest() {
String a = "aaabbb"; final String a = "aaabbb";
String prefix = "aaa"; String prefix = "aaa";
Assert.assertEquals("bbb", StrUtil.removePrefixIgnoreCase(a, prefix)); Assert.assertEquals("bbb", StrUtil.removePrefixIgnoreCase(a, prefix));
@ -382,7 +382,7 @@ public class StrUtilTest {
@Test @Test
public void maxLengthTest() { public void maxLengthTest() {
String text = "我是一段正文,很长的正文,需要截取的正文"; final String text = "我是一段正文,很长的正文,需要截取的正文";
String str = StrUtil.maxLength(text, 5); String str = StrUtil.maxLength(text, 5);
Assert.assertEquals("我是一段正...", str); Assert.assertEquals("我是一段正...", str);
str = StrUtil.maxLength(text, 21); str = StrUtil.maxLength(text, 21);
@ -457,31 +457,31 @@ public class StrUtilTest {
@Test @Test
public void subBetweenAllTest2() { public void subBetweenAllTest2() {
//issue#861@Github起始不匹配的时候应该直接空 //issue#861@Github起始不匹配的时候应该直接空
String src1 = "/* \n* hutool */ asdas /* \n* hutool */"; final String src1 = "/* \n* hutool */ asdas /* \n* hutool */";
String src2 = "/ * hutool */ asdas / * hutool */"; final String src2 = "/ * hutool */ asdas / * hutool */";
String[] results1 = StrUtil.subBetweenAll(src1, "/**", "*/"); final String[] results1 = StrUtil.subBetweenAll(src1, "/**", "*/");
Assert.assertEquals(0, results1.length); Assert.assertEquals(0, results1.length);
String[] results2 = StrUtil.subBetweenAll(src2, "/*", "*/"); final String[] results2 = StrUtil.subBetweenAll(src2, "/*", "*/");
Assert.assertEquals(0, results2.length); Assert.assertEquals(0, results2.length);
} }
@Test @Test
public void subBetweenAllTest3() { public void subBetweenAllTest3() {
String src1 = "'abc'and'123'"; final String src1 = "'abc'and'123'";
String[] strings = StrUtil.subBetweenAll(src1, "'", "'"); String[] strings = StrUtil.subBetweenAll(src1, "'", "'");
Assert.assertEquals(2, strings.length); Assert.assertEquals(2, strings.length);
Assert.assertEquals("abc", strings[0]); Assert.assertEquals("abc", strings[0]);
Assert.assertEquals("123", strings[1]); Assert.assertEquals("123", strings[1]);
String src2 = "'abc''123'"; final String src2 = "'abc''123'";
strings = StrUtil.subBetweenAll(src2, "'", "'"); strings = StrUtil.subBetweenAll(src2, "'", "'");
Assert.assertEquals(2, strings.length); Assert.assertEquals(2, strings.length);
Assert.assertEquals("abc", strings[0]); Assert.assertEquals("abc", strings[0]);
Assert.assertEquals("123", strings[1]); Assert.assertEquals("123", strings[1]);
String src3 = "'abc'123'"; final String src3 = "'abc'123'";
strings = StrUtil.subBetweenAll(src3, "'", "'"); strings = StrUtil.subBetweenAll(src3, "'", "'");
Assert.assertEquals(1, strings.length); Assert.assertEquals(1, strings.length);
Assert.assertEquals("abc", strings[0]); Assert.assertEquals("abc", strings[0]);
@ -489,8 +489,8 @@ public class StrUtilTest {
@Test @Test
public void subBetweenAllTest4() { public void subBetweenAllTest4() {
String str = "你好:1388681xxxx用户已开通,1877275xxxx用户已开通,无法发送业务开通短信"; final String str = "你好:1388681xxxx用户已开通,1877275xxxx用户已开通,无法发送业务开通短信";
String[] strings = StrUtil.subBetweenAll(str, "1877275xxxx", ","); final String[] strings = StrUtil.subBetweenAll(str, "1877275xxxx", ",");
Assert.assertEquals(1, strings.length); Assert.assertEquals(1, strings.length);
Assert.assertEquals("用户已开通", strings[0]); Assert.assertEquals("用户已开通", strings[0]);
} }
@ -498,9 +498,9 @@ public class StrUtilTest {
@Test @Test
public void briefTest() { public void briefTest() {
// case: 1 str.length - 1 // case: 1 str.length - 1
String str = RandomUtil.randomString(RandomUtil.randomInt(1, 100)); final String str = RandomUtil.randomString(RandomUtil.randomInt(1, 100));
for (int maxLength = 1; maxLength < str.length(); maxLength++) { for (int maxLength = 1; maxLength < str.length(); maxLength++) {
String brief = StrUtil.brief(str, maxLength); final String brief = StrUtil.brief(str, maxLength);
Assert.assertEquals(brief.length(), maxLength); Assert.assertEquals(brief.length(), maxLength);
} }
@ -513,7 +513,7 @@ public class StrUtilTest {
@Test @Test
public void briefTest2() { public void briefTest2() {
String str = "123"; final String str = "123";
int maxLength = 3; int maxLength = 3;
String brief = StrUtil.brief(str, maxLength); String brief = StrUtil.brief(str, maxLength);
Assert.assertEquals("123", brief); Assert.assertEquals("123", brief);
@ -529,7 +529,7 @@ public class StrUtilTest {
@Test @Test
public void briefTest3() { public void briefTest3() {
String str = "123abc"; final String str = "123abc";
int maxLength = 6; int maxLength = 6;
String brief = StrUtil.brief(str, maxLength); String brief = StrUtil.brief(str, maxLength);
@ -560,7 +560,7 @@ public class StrUtilTest {
public void filterTest() { public void filterTest() {
final String filterNumber = StrUtil.filter("hutool678", CharUtil::isNumber); final String filterNumber = StrUtil.filter("hutool678", CharUtil::isNumber);
Assert.assertEquals("678", filterNumber); Assert.assertEquals("678", filterNumber);
String cleanBlank = StrUtil.filter(" 你 好 ", c -> !CharUtil.isBlankChar(c)); final String cleanBlank = StrUtil.filter(" 你 好 ", c -> !CharUtil.isBlankChar(c));
Assert.assertEquals("你好", cleanBlank); Assert.assertEquals("你好", cleanBlank);
} }
@ -575,8 +575,8 @@ public class StrUtilTest {
@Test @Test
public void startWithTest() { public void startWithTest() {
String a = "123"; final String a = "123";
String b = "123"; final String b = "123";
Assert.assertTrue(StrUtil.startWith(a, b)); Assert.assertTrue(StrUtil.startWith(a, b));
Assert.assertFalse(StrUtil.startWithIgnoreEquals(a, b)); Assert.assertFalse(StrUtil.startWithIgnoreEquals(a, b));
@ -602,33 +602,39 @@ public class StrUtilTest {
@Test @Test
public void isCharEqualsTest() { public void isCharEqualsTest() {
String a = "aaaaaaaaa"; final String a = "aaaaaaaaa";
Assert.assertTrue(StrUtil.isCharEquals(a)); Assert.assertTrue(StrUtil.isCharEquals(a));
} }
@Test @Test
public void isNumericTest() { public void isNumericTest() {
String a = "2142342422423423"; final String a = "2142342422423423";
Assert.assertTrue(StrUtil.isNumeric(a)); Assert.assertTrue(StrUtil.isNumeric(a));
} }
@Test @Test
public void containsAllTest() { public void containsAllTest() {
String a = "2142342422423423"; final String a = "2142342422423423";
Assert.assertTrue(StrUtil.containsAll(a, "214", "234")); Assert.assertTrue(StrUtil.containsAll(a, "214", "234"));
} }
@Test @Test
public void replaceLastTest() { public void replaceLastTest() {
String str = "i am jackjack"; final String str = "i am jackjack";
String result = StrUtil.replaceLast(str, "JACK", null, true); final String result = StrUtil.replaceLast(str, "JACK", null, true);
Assert.assertEquals(result, "i am jack"); Assert.assertEquals(result, "i am jack");
} }
@Test @Test
public void replaceFirstTest() { public void replaceFirstTest() {
String str = "yesyes i do"; final String str = "yesyes i do";
String result = StrUtil.replaceFirst(str, "YES", "", true); final String result = StrUtil.replaceFirst(str, "YES", "", true);
Assert.assertEquals(result, "yes i do"); Assert.assertEquals(result, "yes i do");
} }
@Test
public void issueI5YN49Test() {
final String str = "A5E6005700000000000000000000000000000000000000090D0100000000000001003830";
Assert.assertEquals("38", StrUtil.subWithLength(str,-2,2));
}
} }