用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类,使用一个Map来进行参数值设置。
package com.softparty.fw.common;
import java.util.HashMap;
import java.util.Map;
/**
* 从字符串中分析参数的类
*/
public class ParametersUtils {
// 执行状态标识
// NORMAL,普通状态
// BEGIN,在 $ 字符之后
// START,在 ${ 字符之后
private static final int NORMAL = 0, BEGIN = 1, START = 2;
// 保存结果
private String result = "";
/**
* 构造器
* @param value
* @param request
*/
public ParametersUtils(String value, ValueCallbackHander hander) {
this.parse(value, hander);
}
/**
* 解析字符串
* @param value 带有${name}占位符的字符串
* @param hander 获取占位符参数的handler对象
*/
private void parse(String value, ValueCallbackHander hander) {
// 保存结果字符串的字符串缓冲对象
StringBuilder result = new StringBuilder(value.length());
// 保存每个参数名称的字符串缓冲对象
StringBuilder param = new StringBuilder();
// 保存状态值
int mark = NORMAL;
// 遍历字符串
for (int i = 0; i < value.length(); i++) {
// 获取字符串指定字符
char c = value.charAt(i);
// 根据字符值进行分支
switch (c) {
case '$':
// 对于状态为NORMAL的情况,转为BEGIN状态
if (mark == NORMAL) {
mark = BEGIN;
} else {
// 对于连续出现两个$字符的情况,忽略前一个$字符,维持BEGIN状态
if (mark == BEGIN) {
result.append('$');
} else {
// 如果是其它状态(START)
result.append(c);
}
}
break;
case '{':
// 对于BEGIN状态,将状态转为START状态
if (mark == BEGIN) {
mark = START;
} else {
// 对于其它状态,统一转为NORMAL
mark = NORMAL;
// 加入result字符串
result.append(c);
}
break;
case '}':
if (mark == START) {
Object p = hander.getValue(param.toString());
if (p == null) {
p = "";
}
// 加入result字符串
result.append(p.toString());
param.setLength(0);
} else {
result.append(c);
}
// 对于START状态,转为NORMAL状态,并获取参数值
mark = NORMAL;
break;
default: // 对于其它字符
if (mark == START) {
// 处理状态为START的
param.append(c);
} else {
mark = NORMAL;
}
if (mark == NORMAL) {
// 处理状态为NORMAL的
result.append(c);
}
}
}
this.result = result.toString();
}
/**
* 获取处理结果
*/
public String getResult() {
return result;
}
/**
* 测试
*/
public static void main(String[] args) {
final Map<String, Object> map = new HashMap<>();
map.put("name", "ok");
map.put("test", 1234);
map.put("ok", true);
ParametersUtils utils = new ParametersUtils("hello$${name}${test},{ok}{${ok}}", new ValueCallbackHander() {
@Override
public Object getValue(String key) {
return map.get(key);
}
});
System.out.println(utils.getResult());
}
}
其中用到的ValueCallbackHandler接口如下:
package com.softparty.fw.common;
/**
* 用于根据Key获取Value的Handler接口
*/
public interface ValueCallbackHander {
/**
* 获取值
* @param key 指定的Key
* @return 获取的值
*/
Object getValue(String key);
}