修复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 】 修复IoUtil.copyByNIO方法写出时没有flush的问题
* 【core 】 修复TreeBuilder中使用HashMap导致默认乱序问题issue#I5Z8C5@Gitee
* 【core 】 修复StrUtil.subWithLength负数问题issue#I5YN49@Gitee
-------------------------------------------------------------------------------------------------------------
# 5.8.9 (2022-10-22)

View File

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