Skip to content
This repository was archived by the owner on Nov 21, 2020. It is now read-only.

Commit a4d8d77

Browse files
committed
feat: add trim method for string
1 parent 772867a commit a4d8d77

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package org.code4everything.boot.base;
2+
3+
import cn.hutool.core.util.StrUtil;
4+
5+
/**
6+
* 字符串工具类
7+
*
8+
* @author pantao
9+
* @since 2019/8/21
10+
*/
11+
public class StringUtils {
12+
13+
private StringUtils() {}
14+
15+
/**
16+
* 裁剪字符串
17+
*
18+
* @param string 原字符串
19+
* @param trimChar 需裁剪的字符
20+
* @param mode 如果 {@code mode&3==1},则裁剪尾部,{@code ==2}裁剪首部,{@code ==3}首尾均裁剪
21+
*
22+
* @return 裁剪后的字符串
23+
*
24+
* @since 1.1.6
25+
*/
26+
public static String trim(String string, char trimChar, int mode) {
27+
int start = 0;
28+
int end = string.length();
29+
boolean trimStart = (mode & 2) == 2;
30+
if (trimStart) {
31+
for (; start < end; start++) {
32+
if (string.charAt(start) != trimChar) {
33+
break;
34+
}
35+
}
36+
}
37+
boolean trimEnd = (mode & 1) == 1;
38+
if (trimEnd) {
39+
for (; end > start; end--) {
40+
if (string.charAt(end - 1) != trimChar) {
41+
break;
42+
}
43+
}
44+
}
45+
return string.substring(start, end);
46+
}
47+
48+
/**
49+
* 裁剪字符串
50+
*
51+
* @param string 原字符串
52+
* @param trimStr 需裁剪的字符串
53+
*
54+
* @return 裁剪后的字符串
55+
*
56+
* @since 1.1.6
57+
*/
58+
public static String trim(String string, String trimStr) {
59+
if (StrUtil.isEmpty(trimStr)) {
60+
return string;
61+
}
62+
int start = trimHelper(string, trimStr, 0, string.length(), trimStr.length());
63+
int end = trimHelper(string, trimStr, start, string.length(), -trimStr.length());
64+
return string.substring(start, end);
65+
}
66+
67+
/**
68+
* 裁剪字符串
69+
*
70+
* @param string 原字符串
71+
* @param trimStr 需裁剪的字符串
72+
*
73+
* @return 裁剪后的字符串
74+
*
75+
* @since 1.1.6
76+
*/
77+
public static String trimStart(String string, String trimStr) {
78+
if (StrUtil.isEmpty(trimStr)) {
79+
return string;
80+
}
81+
return string.substring(trimHelper(string, trimStr, 0, string.length(), trimStr.length()));
82+
}
83+
84+
/**
85+
* 裁剪字符串
86+
*
87+
* @param string 原字符串
88+
* @param trimStr 需裁剪的字符串
89+
*
90+
* @return 裁剪后的字符串
91+
*
92+
* @since 1.1.6
93+
*/
94+
public static String trimEnd(String string, String trimStr) {
95+
if (StrUtil.isEmpty(trimStr)) {
96+
return string;
97+
}
98+
return string.substring(0, trimHelper(string, trimStr, 0, string.length(), -trimStr.length()));
99+
}
100+
101+
private static int trimHelper(String str, String trim, int start, int end, int step) {
102+
if (step == 0) {
103+
throw new IllegalArgumentException("step must not be zero");
104+
}
105+
if (step > 0) {
106+
// 裁剪前面
107+
if (shouldTrim(str, start, end, trim)) {
108+
return trimHelper(str, trim, start + step, end, step);
109+
}
110+
return start;
111+
} else {
112+
// 裁剪后面
113+
int newEnd = end + step;
114+
if (shouldTrim(str, Math.max(start, newEnd), end, trim)) {
115+
return trimHelper(str, trim, start, newEnd, step);
116+
}
117+
return end;
118+
}
119+
}
120+
121+
private static boolean shouldTrim(String str, int start, int end, String trim) {
122+
if (end - start < trim.length()) {
123+
return false;
124+
}
125+
for (int i = 0; i < trim.length(); i++, start++) {
126+
if (str.charAt(start) != trim.charAt(i)) {
127+
return false;
128+
}
129+
}
130+
return true;
131+
}
132+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.code4everything.boot.base;
2+
3+
import org.junit.Test;
4+
5+
public class StringUtilsTest {
6+
7+
@Test
8+
public void trim() {
9+
assert " b c dda".equals(StringUtils.trim("aa b c dda", "aa"));
10+
assert "".equals(StringUtils.trim("abcabcabcabc", "abc"));
11+
}
12+
13+
@Test
14+
public void trimStart() {
15+
assert "kkgh".equals(StringUtils.trimStart("ghghkkgh", "gh"));
16+
}
17+
18+
@Test
19+
public void trimEnd() {
20+
assert "aab".equals(StringUtils.trimEnd("aabuiuiuiuiui", "ui"));
21+
assert "".equals(StringUtils.trimEnd("123123123123123", "123"));
22+
}
23+
24+
@Test
25+
public void testTrim() {
26+
String str = "0001001110011000";
27+
assert StringUtils.trim(str, "0").equals(StringUtils.trim(str, '0', 3));
28+
assert StringUtils.trimStart(str, "0").equals(StringUtils.trim(str, '0', 2));
29+
assert StringUtils.trimEnd(str, "0").equals(StringUtils.trim(str, '0', 1));
30+
}
31+
}

0 commit comments

Comments
 (0)