diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/text/placeholder/StrMatcher.java b/hutool-core/src/main/java/cn/hutool/v7/core/text/placeholder/StrMatcher.java index 11316ecdb1..8f1e7b5cb0 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/text/placeholder/StrMatcher.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/text/placeholder/StrMatcher.java @@ -93,8 +93,9 @@ public class StrMatcher { * * @param pattern 表达式,使用${XXXX}作为变量占位符 * @return 表达式 + * @throws IllegalArgumentException 连续变量不支持,例如:${a}${b} */ - private static List parse(final String pattern) { + private static List parse(final String pattern) throws IllegalArgumentException { final List patterns = new ArrayList<>(); final int length = pattern.length(); char c = 0; @@ -107,6 +108,13 @@ public class StrMatcher { if (inVar) { part.append(c); if ('}' == c) { + if (!patterns.isEmpty()) { + final String lastPart = patterns.get(patterns.size() - 1); + if (StrUtil.isWrap(lastPart, "${", "}")) { + // issue#IDFNF7 连续变量会导致歧义,例如:${a}${b} 不支持 + throw new IllegalArgumentException(StrUtil.format("Consecutive variables '{}{}' are not supported", lastPart, part.toString())); + } + } // 变量结束 inVar = false; patterns.add(part.toString()); diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/text/StrMatcherTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/text/StrMatcherTest.java index 82bd19bc30..e11e3de965 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/text/StrMatcherTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/text/StrMatcherTest.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import java.util.Map; +import static org.junit.jupiter.api.Assertions.assertThrows; + public class StrMatcherTest { @Test @@ -54,4 +56,12 @@ public class StrMatcherTest { Assertions.assertEquals("小明", match.get("name")); Assertions.assertEquals("20", match.get("year")); } + + @Test + public void issueIDFNF7Test() { + assertThrows( + IllegalArgumentException.class, + () -> new StrMatcher("${a}${b}") + ); + } }