一. 概述
二. 示例
示例占位符规则: ${param}
2.1 工具类
/**
* 获取字符串里的占位符列表, 占位符样式 ${param}
* @param content
* @return
*/
public static List<String> getPlaceholderList(String content){
char[] textChars = content.toCharArray();
StringBuilder textSofar = new StringBuilder();
StringBuilder sb = new StringBuilder();
// 存储占位符 位置信息集合
List<String> placeholderList = new ArrayList<>();
// 当前标识
int modeTg = ignoreTg;
for (int m = 0; m < textChars.length; m++) {
char c = textChars[m];
textSofar.append(c);
switch (c) {
case '$': {
modeTg = startTg;
sb.append(c);
}
break;
case '{': {
if (modeTg == startTg) {
sb.append(c);
modeTg = readTg;
} else {
if (modeTg == readTg) {
sb = new StringBuilder();
modeTg = ignoreTg;
}
}
}
break;
case '}': {
if (modeTg == readTg) {
modeTg = ignoreTg;
sb.append(c);
String str = sb.toString();
if (StringUtil.notEmpty(str)) {
placeholderList.add(str);
textSofar = new StringBuilder();
}
sb = new StringBuilder();
} else if (modeTg == startTg) {
modeTg = ignoreTg;
sb = new StringBuilder();
}
}
default: {
if (modeTg == readTg) {
sb.append(c);
} else if (modeTg == startTg) {
modeTg = ignoreTg;
sb = new StringBuilder();
}
}
}
}
return placeholderList;
}
2.2 测试
public static void main(String[] args) {
String content = "<p>\n" +
" 第一段占位符: ${name1}\n" +
"</p>\n" +
"<p>\n" +
" 第二段占位符: ${name2}\n" +
"</p>";
List<String> placeholderList = getPlaceholderList(content);
placeholderList.forEach(System.out::println);
}
打印
${name1}
${name2}