一. 概述
今天介绍一个简单的获取字符串占位符列表demo, 原理就是把字符串分解成一个字节数组, 然后遍历占位符特殊标识包囊的一段符号
二. 示例
示例占位符规则: ${param}
2.1 工具类
/**
* 获取字符串里的占位符列表, 占位符样式 ${param}
* @param content
* @return
*/
public static List getPlaceholderList(String content){
char[] textChars = content.toCharArray();
StringBuilder textSofar = new StringBuilder();
StringBuilder sb = new StringBuilder();
// 存储占位符 位置信息集合
List 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 = "
\n" +
" 第一段占位符: ${name1}\n" +
"
\n" +
"
\n" +
" 第二段占位符: ${name2}\n" +
"
";
List placeholderList = getPlaceholderList(content);
placeholderList.forEach(System.out::println);
}
打印
${name1}
${name2}