diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/StrLengthComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/StrLengthComparator.java new file mode 100755 index 000000000..6c794bfdf --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/StrLengthComparator.java @@ -0,0 +1,25 @@ +package cn.hutool.core.comparator; + +import java.util.Comparator; + +/** + * 字符串长度比较器,短在前 + * + * @author looly + * @since 5.8.9 + */ +public class StrLengthComparator implements Comparator { + /** + * 单例的字符串长度比较器,短在前 + */ + public static final StrLengthComparator INSTANCE = new StrLengthComparator(); + + @Override + public int compare(final CharSequence o1, final CharSequence o2) { + int result = Integer.compare(o1.length(), o2.length()); + if (0 == result) { + result = CompareUtil.compare(o1.toString(), o2.toString()); + } + return result; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java index e7c242c7c..4ecbedc41 100755 --- a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.regex; import cn.hutool.core.collection.SetUtil; +import cn.hutool.core.comparator.StrLengthComparator; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Validator; @@ -878,7 +879,8 @@ public class ReUtil { final Matcher matcher = pattern.matcher(content); boolean result = matcher.find(); if (result) { - final Set varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, new HashSet<>()); + final Set varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, + new TreeSet<>(StrLengthComparator.INSTANCE.reversed())); final StringBuffer sb = new StringBuffer(); do { String replacement = replacementTemplate; diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index 11c0de80d..e9504494d 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -204,4 +204,12 @@ public class ReUtilTest { Assert.assertEquals(map.get("month"), "10"); Assert.assertEquals(map.get("day"), "11"); } + + @Test + public void issuesI5TQDRTest(){ + final Pattern patternIp = Pattern.compile("((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})\\.((2(5[0-5]|[0-4]\\d))" + + "|[0-1]?\\d{1,2})\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})"); + final String s = ReUtil.replaceAll("1.2.3.4", patternIp, "$1.**.**.$10"); + Assert.assertEquals("1.**.**.4", s); + } }