1.通过正则表达式获取
String pattern = "\\$\\{[^}(?!{)]*\\}";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(content);
while(m.find()){
// ${}和 里面的内容
String var = m.group(0);
}
在网上找了一些,发现用的都是 \$\{[^}]*\} 这种正则,有个问题,如果字符串是xxxxx${{sdfs}sds 这种情况的时候会提取到变量 {sdfs,具体依据自己的业务选择需要的正则表达式提取。
2. 使用char数组加标识位提取
//标识位
//忽略标识
public static final int ignoreTg = 0;
// 读取到$
public static final int startTg = 1;
// 读取到{
public static final int readTg = 2;
//字符串转成char数组
char[] chars = content.toCharArray();
//记录变量信息
StringBuilder sb = new StringBuilder();
//当前标识
int modeTg = ignoreTg;
for(int i = 0; i < chars.length;i++){
char c = chars[i];
switch (c){
case '$':
modeTg = startTg;
break;
case '{':
if(modeTg == startTg){
modeTg = readTg;//定位到变量开始位置
}else {
// 类似 xxxx{xxxx 无用
sb = new StringBuilder();
modeTg = ignoreTg;
}
break;
case '}':
if(modeTg == readTg){
modeTg = ignoreTg; // 变量提取结束
String str = sb.toString();
if(StringUtils.isNotBlank(str)){
// 要提取的变量,依据自己的实际需要,存入,list或者其他集合中
}
sb = new StringBuilder();
}else {
// 类似 xxxxx}xxxx 无用
modeTg = ignoreTg;
sb = new StringBuilder();
}
break;
default:
if(modeTg == readTg){
// 标签内容
sb.append(c);
}
break;
}
}
两种方式运行速度比较,正则表达式较快。