一个用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类
来源:互联网 发布:刘涛 黑历史 知乎 编辑:程序博客网 时间:2024/06/07 15:07
用于对于诸如 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 {// 对于其它状态,统一转为NORMALmark = 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() {@Overridepublic 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);}
- 一个用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类
- 实现删除字符串p1中含有的所有字符串p2
- 【Java】编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
- 给定一个平面内三个不同的点p1、p2和p3,求出任意两点(即点p1和点p2、点p1和点p3、点p2和点p3)之间的距离。
- 2.输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
- 位运算训练02—输入一个整数a,再输入两个整数p1,p2(p1,p2<32) 输出该整数的二进制表示方法中从右端开始的p1到p2位
- 位运算训练03—输入一个整数a,再输入两个整数p1,p2(p1,p2<32);将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- 输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
- Rs.open sql,conn,p1,p2的p1、p2代表什么
- 算法二:计算1-3000 等于p1*p1*p2的数,其中p1!=p2且都是质数
- 【Chapter 1】P1-P2
- 线程同步面试题,3个线程打印一个1-100的数组,要求P1=1,P2=2,P3=3,P1=4的形式
- 输入一个整数a,再输入两个整数p1ip2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位i
- 计算nth 个质因数是p1,p2,p3的数
- 等待事件对应的p1,p2,p3含义
- 等待事件对应的p1,p2,p3含义
- 交换*p1和*p2的值中常犯错误
- 【Mybatis】Mybatis中IFNULL(P1,P2)函数的用法;
- Host SMBus controller not enabled!
- [备忘]Linux操作系统里查看所有用户
- 通过函数调用找出数组中的最大值及其所在的行和列.Cpp
- 循环输入一个数,判断其是否是素数.Cpp
- 用extern对外部变量作提前引用声明,以扩展程序文件的作用域.Cpp
- 一个用于对于诸如 abc${p1}${p2}def 这样字符串进行处理的Java类
- 用scanf和printf函数进行输入和输出.cpp
- 关于java中反斜杠和斜杠与路径的关系
- 用递归的方法求n!.cpp
- 用函数模板来实现函数重载的功能.cpp
- 用数组来处理求Fibonacci数列问题.Cpp
- 【hadoop】ssh localhost 免密码登陆(图解)
- 用选择法对数组中的10个数进行从小到大排序.Cpp
- BugNet使用指南三