java 字符串中参数化符号${}的解析

摘要:
我们在很多地方都能看到代表参数意义的符号${},可能我们在写一些框架的时候,有时候也需要用到这个符号,但他们是如何精确解析的?我们先来看以下的几个场景:1.字符串"a${a}a"2.字符串"a${a}a"3.字符串"a${a}a"4.字符串"a${a}a}a"5.字符串"a${a}a${"6.字符串"a${a}a${a}"以上几个字符串中,基本上包括了使用的一些场景,所以我们在解析的时候,要把各种情况都考虑清楚,尽量的做到全面,这样我们的框架才有意义。=0)returnStr=list.get;returnreturnStr;}publicstaticvoidmain{RegExpre=newRegExp();System.out.println;}}然后开始来解析了,很简单,一个正则即可:publicclassParseKeyword{publicListgetKeywords{Stringreg="(?

我们在很多地方都能看到代表参数意义的符号${},可能我们在写一些框架的时候,有时候也需要用到这个符号,但他们是如何精确解析的?或者说需要我们自已写的时候,如何写?我们先来看以下的几个场景:

1.字符串"a${a}a"

2.字符串"a${a}a"

3.字符串"a${a}a"

4.字符串"a${a}a}a"

5.字符串"a${a}a${"

6.字符串"a${a}a${a}"

以上几个字符串中,基本上包括了使用的一些场景,所以我们在解析的时候,要把各种情况都考虑清楚,尽量的做到全面,这样我们的框架才有意义。

很显然,我们都会采用正则来解析,于是我们来新建一个JAVA正则的类:

public class RegExp {
	public boolean match(String reg, String str) {
		return Pattern.matches(reg, str);
	}
	public List<String> find(String reg, String str) {
		Matcher matcher = Pattern.compile(reg).matcher(str);
		List<String> list = new ArrayList<String>();
		while (matcher.find()) {
			list.add(matcher.group());
		}
		return list;
	}
	public List<String> find(String reg, String str, int index) {
		Matcher matcher = Pattern.compile(reg).matcher(str);
		List<String> list = new ArrayList<String>();
		while (matcher.find()) {
			list.add(matcher.group(index));
		}
		return list;
	}
	public String findString(String reg, String str, int index) {
		String returnStr = null;
		List<String> list = this.find(reg, str, index);
		if (list.size() != 0)
			returnStr = list.get(0);
		return returnStr;		
	}
	public String findString(String reg, String str) {
		String returnStr = null;
		List<String> list = this.find(reg, str);
		if (list.size() != 0)
			returnStr = list.get(0);
		return returnStr;
	}
	public static void main(String[] args) {
		RegExp re = new RegExp();
		System.out.println(re.find("(a)b", "ababab", 1));
	}
}

然后开始来解析了,很简单,一个正则即可:

public class ParseKeyword {
	public List<String> getKeywords(String p){
	    String reg = "(?<=(?<!\\)\$\{)(.*?)(?=(?<!\\)\})";     
	    RegExp re = new RegExp();
	    List<String> list = re.find(reg, p);
	    return list;
	}
	public static void main(String[] args) {
		ParseKeyword p = new ParseKeyword();
		System.out.println(p.getKeywords("a${a}a"));
		System.out.println(p.getKeywords("a\${a}a"));
		System.out.println(p.getKeywords("a${a\}a"));
		System.out.println(p.getKeywords("a${a\}a}a"));
		System.out.println(p.getKeywords("a${a}a${"));
		System.out.println(p.getKeywords("a${ab}a${a}"));
	}
}

总结一下:解析这个参数符号,要掌握的主要是正则,其中尤其以预查模式(欢迎访问我的一篇关于预查模式的博客),然后其它的就是一些字符串的操作方法了。

希望能对大家有用。

免责声明:文章转载自《java 字符串中参数化符号${}的解析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MVC5 + EF6 完整入门教程三SIGPIPE下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

windows 常用命令行操作

目录操作˃pwd打印当前工作目录,通过此关键词可以查看当前所处的路径˃cd更改目录,用于多个目录之间的切换具体输入:cd目录名cd目录名/子目录名(可通过此方式到达最底层的目录)cd~(返回home目录)cd..(返回上一级目录)cd../..(返回上两级目录)cd盘符名:(不同盘符间跳转,cd后面跟上路径则可实现精准跳转)˃mkdir创建目录具体输入:mk...

ios 苹果和百度地图的相关使用

同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度,确实做一些地图相关的东西,非常有吸引力。只是实现了显示一个百度地图的view。百度地图使用的是Objective-C++,这意味这必须要有一个.mm文件。...

IntelliJ idea设置显示错误代码提示

idea默认关闭自动编译,所以一些编译错误只有在编译的时候才会提示,例如修改了引用类。按图中设置打开自动编译:注意:idea默认打开省电模式,自动编译在省电模式下被禁用,所以需要在file˃powersavemode关闭省电模式。...

dbeaver 驱动安装

一、背景:在Windows10安装dbeaver数据库连接工具,点“测试连接”的时候出现报错如下:ErrorresolvingdependenciesMavenartifact'maven:/mysql:mysql-connector-java:RELEASE'nofound经网上查询是dbeaver驱动无法下载的问题。二、解决方法:打开“窗口”-˃“首选项...

uniapp打包h5 出现'连接服务器超时,点击屏幕重试'的页面

跟踪以首先找出原因全局组件AsyncErrorNew在中注册。js文件可以自定义。我很快就过去了,所以我添加了一个空白页面,然后在清单中介绍了组件。json文件...