diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5bb8d6deb..46b525879 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@
* 【core 】 CsvWriter修改规则,去除末尾多余换行符(issue#I4RSQY@Gitee)
* 【core 】 DateUtil增加rangeFunc和rangeConsume(issue#I4RSQY@Gitee)
* 【core 】 DateTime增加setUseJdkToStringStyle方法
+* 【core 】 CharSequenceUtil增加replace重载(issue#2122@Github)
### 🐞Bug修复
* 【core 】 修复ChineseDate农历获取正月出现数组越界BUG(issue#2112@Github)
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java
index 2d7bcad89..4a308c14d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java
@@ -3601,6 +3601,46 @@ public class CharSequenceUtil {
return stringBuilder.toString();
}
+ /**
+ * 替换指定字符串的指定区间内字符为指定字符串,字符串只重复一次
+ * 此方法使用{@link String#codePoints()}完成拆分替换
+ *
+ * @param str 字符串
+ * @param startInclude 开始位置(包含)
+ * @param endExclude 结束位置(不包含)
+ * @param replacedStr 被替换的字符串
+ * @return 替换后的字符串
+ * @since 3.2.1
+ */
+ public static String replace(CharSequence str, int startInclude, int endExclude, CharSequence replacedStr) {
+ if (isEmpty(str)) {
+ return str(str);
+ }
+ final String originalStr = str(str);
+ int[] strCodePoints = originalStr.codePoints().toArray();
+ final int strLength = strCodePoints.length;
+ if (startInclude > strLength) {
+ return originalStr;
+ }
+ if (endExclude > strLength) {
+ endExclude = strLength;
+ }
+ if (startInclude > endExclude) {
+ // 如果起始位置大于结束位置,不替换
+ return originalStr;
+ }
+
+ final StringBuilder stringBuilder = new StringBuilder();
+ for (int i = 0; i < startInclude; i++) {
+ stringBuilder.append(new String(strCodePoints, i, 1));
+ }
+ stringBuilder.append(replacedStr);
+ for (int i = endExclude; i < strLength; i++) {
+ stringBuilder.append(new String(strCodePoints, i, 1));
+ }
+ return stringBuilder.toString();
+ }
+
/**
* 替换所有正则匹配的文本,并使用自定义函数决定如何替换
* replaceFun可以通过{@link Matcher}提取出匹配到的内容的不同部分,然后经过重新处理、组装变成新的内容放回原位。
diff --git a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java
index 18b84edb2..07afd2b4a 100644
--- a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java
@@ -22,6 +22,13 @@ public class CharSequenceUtilTest {
Assert.assertEquals(replace, result);
}
+ @Test
+ public void replaceByStrTest(){
+ String replace = "SSM15930297701BeryAllen";
+ String result = CharSequenceUtil.replace(replace, 5, 12, "***");
+ Assert.assertEquals("SSM15***01BeryAllen", result);
+ }
+
@Test
public void addPrefixIfNotTest(){
String str = "hutool";
diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java
index 0564af9ac..e79c9b784 100644
--- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java
@@ -2,6 +2,7 @@ package cn.hutool.core.text.csv;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
+import org.junit.Ignore;
import org.junit.Test;
public class CsvWriterTest {