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}"
以上几个字符串中,基本上包括了使用的一些场景,所以我们在解析的时候,要把各种情况都考虑清楚,尽量的做到全面,这样我们的框架才有意义。
很显然,我们都会采用正则来解析,于是我们来新建一个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 字符串中参数化符号${}的解析的更多相关文章
- PHP 自定义字符串中的变量名解析
PHP 自定义字符串中的变量名解析 这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...
- Java字符串中常见的10个问题
下面是Java中10个最常见的关于字符串的问题. 怎样比较字符串?使用==还是equals() 简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等.除非你要比较两个字符串是否是 ...
- Java字符串中常用字符占用字节数
java中一个char型的数据(也就是一个字符)占两个字节.而Java中常用的字符包括数字.英文字母.英文符号.中文汉字.中文符号等,若在字符串中包含里面的多种字符,它们是否都占两个字符呢?答案是否定 ...
- Java 7 和 Java 8 中的 HashMap原理解析
HashMap 可能是面试的时候必问的题目了,面试官为什么都偏爱拿这个问应聘者?因为 HashMap 它的设计结构和原理比较有意思,它既可以考初学者对 Java 集合的了解又可以深度的发现应聘者的数据 ...
- Java - 字符串和Unicode互转 - 解析小米pm.min.js
小米JS地址: http://p.www.xiaomi.com/zt/20130313/huodong/pm.min.js 上面这个JS是小米抢手机页面的代码.和抢手机有直接关联.. 虽然我3次都没抢 ...
- 在java项目中怎样利用Dom4j解析XML文件获取数据
在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...
- 替换Java字符串中的“& lt;”为“<”
发布webservice时 Java中的String类型会将 “<” 自动转换为 “<”,在建String转换为XML时就会出错,具体做法是: String strXml = “< ...
- 一个Java字符串中到底有多少个字符?
依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),最大值是\uffff(65535), 也就是一个字符以2个字节来表示,难道Java最多只能表示 ...
- thread.join函数,java多线程中的join函数解析
join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 package mian; public class simpleplela { static ...
随机推荐
- POJ 3181 Dollar Dayz 【完全背包】
题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数. 那么dp[i][0] = 1,使用任何价格配出金额0的 ...
- 【BZOJ2839】集合计数&&【BZOJ3622】已经没有什么好害怕的了
再谈容斥原理来两道套路几乎一致的题目[BZOJ2839]集合计数Description一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交 ...
- BZOJ 3771 Triple FFT+容斥原理
解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...
- Codeforces 251C Number Transformation
Number Transformation 我们能发现这个东西是以2 - k的lcm作为一个循环节, 然后bfs就好啦. #include<bits/stdc++.h> #define L ...
- xml和map互转工具类
/** * xml转map工具类 * @author zhangyao * */ public class XmlToMapUtil { /** * xml转map 不带属性 * @param xml ...
- 6.Django与Ajax
Ajax 文件夹为Ajaxdemo 向服务器发送请求的途径: 1.浏览器地址栏,默认get请求: 2.form表单: get请求 post请求 3.a标签,超链接(get请求) 4.Ajax请求 特点 ...
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...
- Session失效后所有Ajax请求跳转登录地址
当登录的Session失效后,采用ajax请求数据时会没有反应,这时候应该自动跳转到登录页面,让用户重新登录. 全局配置以下可实现 $(function() { $.ajaxSetup({ compl ...
- Java并发程序设计(八)设计模式与并发之单例模式
设计模式与并发之单例模式 简单的单例实现: public class Singleton { private Singleton(){ System.out.println("Creatin ...
- [HDU1598]find the most comfortable road
思路: 考虑一个暴力:枚举最大的边权和最小的边权,然后将边权在这之间的边全拿出来构成一张无向图,剩下的就是判断是否存在一条从$S$到$T$的路径.相当于判$S$和$T$是否连通,用并查集连一下即可.时 ...