diff --git a/hutool-core/src/main/java/cn/hutool/core/text/PlaceholderParser.java b/hutool-core/src/main/java/cn/hutool/core/text/PlaceholderParser.java index c01cd61164d4d30530ccb3affc3dc5c86c475dbb..3bad83de337e95735480f7d24693b8c279bc2610 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/PlaceholderParser.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/PlaceholderParser.java @@ -102,52 +102,47 @@ public class PlaceholderParser implements UnaryOperator { // 开始匹配 char[] src = text.toCharArray(); - final StringBuilder result = new StringBuilder(); - StringBuilder expression = new StringBuilder(); - while (openCursor > -1) { - - // 开始符号是否被转义,若是则跳过并寻找下一个开始符号 - if (openCursor > 0 && src[openCursor - 1] == escape) { - result.append(src, closeCursor, openCursor - closeCursor - 1).append(open); - closeCursor = openCursor + openLength; - openCursor = text.indexOf(open, closeCursor); - continue; - } - - // 记录当前位符的开始符号与上一占位符的结束符号间的字符串 - result.append(src, closeCursor, openCursor - closeCursor); - - // 重置结束游标至当前占位符的开始处 - closeCursor = openCursor + openLength; - - // 寻找结束符号下标 - int end = text.indexOf(close, closeCursor); - while (end > -1) { - // 结束符号被转义,寻找下一个结束符号 - if (end > closeCursor && src[end - 1] == escape) { - expression.append(src, closeCursor, end - closeCursor - 1).append(close); - closeCursor = end + closeLength; - end = text.indexOf(close, closeCursor); - } - // 找到结束符号 - else { - expression.append(src, closeCursor, end - closeCursor); - break; - } - } - - // 未能找到结束符号,说明匹配结束 - if (end == -1) { - result.append(src, openCursor, src.length - openCursor); - closeCursor = src.length; - } - // 找到结束符号,将开始到结束符号之间的字符串替换为指定表达式 - else { - result.append(processor.apply(expression.toString())); - expression = new StringBuilder(); - // 完成当前占位符的处理匹配,寻找下一个 - closeCursor = end + close.length(); - } + final StringBuilder result = new StringBuilder(src.length); + StringBuilder expression = new StringBuilder(); + while (openCursor > -1) { + + // 开始符号是否被转义,若是则跳过并寻找下一个开始符号 + if (openCursor > 0 && src[openCursor - 1] == escape) { + result.append(src, closeCursor, openCursor - closeCursor - 1).append(open); + closeCursor = openCursor + openLength; + openCursor = text.indexOf(open, closeCursor); + continue; + } + + // 记录当前位符的开始符号与上一占位符的结束符号间的字符串 + result.append(src, closeCursor, openCursor - closeCursor); + + // 重置结束游标至当前占位符的开始处 + closeCursor = openCursor + openLength; + + // 寻找结束符号下标 + int end = text.indexOf(close, closeCursor); + while (end > -1) { + // 结束符号被转义,寻找下一个结束符号 + if (end > closeCursor && src[end - 1] == escape) { + expression.append(src, closeCursor, end - closeCursor - 1).append(close); + closeCursor = end + closeLength; + end = text.indexOf(close, closeCursor); + if (end == -1) { + throw new UtilException("\"{}\" 中字符下标 {} 处的开始符没有找到对应的结束符", text, openCursor); + } + } + // 找到结束符号 + else { + expression.append(src, closeCursor, end - closeCursor); + break; + } + } + // 找到结束符号,将开始到结束符号之间的字符串替换为指定表达式 + result.append(processor.apply(expression.toString())); + expression.setLength(0); + // 完成当前占位符的处理匹配,寻找下一个 + closeCursor = end + close.length(); // 寻找下一个开始符号 openCursor = text.indexOf(open, closeCursor);