diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2.java index e3fb2156a..1c8232c25 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2.java @@ -61,7 +61,7 @@ public class HighMultiReplacerV2 extends StrReplacer { final char ch = text.charAt(i); final Integer index = charIndexMap.get(ch); // 下一个字符在候选转换字符串中都不存在 ch字符一定不会被替换 - if(index < 0){ + if(index == null || index < 0){ // 临时缓存空间中的数据写入到输出的 StringBuilder if(temp.length() > 0){ stringBuilder.append(temp); @@ -92,14 +92,16 @@ public class HighMultiReplacerV2 extends StrReplacer { // 表示匹配到 现在进行字符串替换工作 if(currentNode.isEnd){ - final int length = currentNode.tagetString.length(); + final int length = currentNode.tagetString.length() - 1; // 先清理匹配到的字符 最后一个字符未加入临时空间 - temp.delete(temp.length() - length + 1,length - 1); + temp.delete(temp.length() - length,temp.length()); if(temp.length() > 0){ stringBuilder.append(temp); } // 写入被替换的字符串 stringBuilder.append(replaceMap.get(currentNode.tagetString)); + // 将临时空间删除 + temp.delete(0, temp.length()); // 因为字符串被替换过了 所以当前节点重新指向 root currentNode = root; continue; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/finder/MultiStrFinderTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/finder/MultiStrFinderTest.java new file mode 100644 index 000000000..94808eeef --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/finder/MultiStrFinderTest.java @@ -0,0 +1,50 @@ +package org.dromara.hutool.core.text.finder; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author cmm + * @date 2024/8/12 11:16 + */ +public class MultiStrFinderTest { + + @Test + public void test1(){ + ArrayList strings = new ArrayList<>(); + strings.add("sha"); + strings.add("asa"); + strings.add("ha"); + strings.add("hex"); + MultiStrFinder finder = MultiStrFinder.of(strings); + String text = "asdasahhxxeshaaahexaaasa"; + Map> match = finder.findMatch(text); + System.out.println(text); + match.forEach((k,v) -> { + System.out.println(k + ":" + v); + }); + + } + + + @Test + public void test2(){ + ArrayList strings = new ArrayList<>(); + strings.add("沙漠"); + strings.add("撒"); + strings.add("哈"); + strings.add("害克斯"); + MultiStrFinder finder = MultiStrFinder.of(strings); + String text = "撒哈拉大沙漠,你看哈哈哈。hex码中文写成海克斯科技"; + Map> match = finder.findMatch(text); + System.out.println(text); + match.forEach((k,v) -> { + System.out.println(k + ":" + v); + }); + + } + +} diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2Test.java new file mode 100644 index 000000000..49a1a2dc3 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/replacer/HighMultiReplacerV2Test.java @@ -0,0 +1,51 @@ +package org.dromara.hutool.core.text.replacer; + +import org.dromara.hutool.core.text.finder.MultiStrFinder; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cmm + * @date 2024/8/12 14:49 + */ +public class HighMultiReplacerV2Test { + @Test + public void test1(){ + HashMap replaceMap = new HashMap<>(); + replaceMap.put("sha","SHA"); + replaceMap.put("asa","ASA"); + replaceMap.put("ha","HA"); + replaceMap.put("hex","HEX"); + HighMultiReplacerV2 replacer = new HighMultiReplacerV2(replaceMap); + String text = "asdasahhxxeshaaahexaaasa"; + CharSequence apply = replacer.apply(text); + replaceMap.forEach((k,v) -> { + System.out.println(k + ":" + v); + }); + System.out.println(text); + System.out.println(apply); + } + + + @Test + public void test2(){ + HashMap replaceMap = new HashMap<>(); + replaceMap.put("沙漠","什么"); + replaceMap.put("撒","厦"); + replaceMap.put("哈","蛤"); + replaceMap.put("海克斯","害可是"); + HighMultiReplacerV2 replacer = new HighMultiReplacerV2(replaceMap); + String text = "撒哈拉大沙漠,你看哈哈哈。hex码中文写成海克斯科技,海克,沙子收拾收拾,撤退,撒下了句点"; + CharSequence apply = replacer.apply(text); + replaceMap.forEach((k,v) -> { + System.out.println(k + ":" + v); + }); + System.out.println(text); + System.out.println(apply); + + } +}