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}"));
 }
}

解析这个参数符号,要掌握的主要是正则,其中尤其以预查模式(推荐一篇预查模式的文章),然后其它的就是一些字符串的操作方法了。

总结

以上就是这篇文章的全部内容改了,希望本文的内容能对大家有用,如果有疑问大家可以留言交流。

(0)

相关推荐

  • 深入解析Java编程中方法的参数传递

    在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value public static class Value { private String value = "value"; public String getValue() { return value; } public void

  • java解析出url请求的路径和参数键值对类(解析出url请求的路径,包括页面)

    复制代码 代码如下: package RequestPackage; import java.util.HashMap; import java.util.Map; public class CRequest { /** * 解析出url请求的路径,包括页面 * @param strURL url地址 * @return url路径 */ public static String UrlPage(String strURL) { String strPage=null; String[] arr

  • java统计字符串单词个数的方法解析

    在一些项目中可能需要对一段字符串中的单词进行统计,我在这里写了一个简单的demo,有需要的同学可以拿去看一下. 不说废话了直接贴代码: 实现代码: /** * 统计各个单词出现的次数 * @param text */ public static void findEnglishNum(String text){ //找出所有的单词 String[] array = {".", " ", "?", "!"}; for (int

  • 深入解析C++和JAVA的字符串

    所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组.C语言中是没有字符串的,只有字符数组. 谈一下C++的字符串:C++提供两种字符串的表示:C风格的字符串和标准C++引入的string类型.一般建议用string类型,但是实际情况中还是要使用老式C风格的字符串. 1.C风格的字符串:C风格字符串起源于C,并在C++中得到扩展.字符串存储在一个字符数组中,例如:        const char *str = "zhangdan";(不要忘掉最后的\0)       

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • java解析任意层数json字符串的方法

    复制代码 代码如下: //解析策略,有可能是解析json字符串,有可能为数据中的图片地址,email等package cc.util.regex; public enum RegexPolicy { Json("Json"), Image("ImageFromHtml"); private String value; RegexPolicy (String value) {  this.value = value; } @Override public String

  • Java生成和解析XML格式文件和字符串的实例代码

    1.基础知识: Java解析XML一般有四种方法:DOM.SAX.JDOM.DOM4J. 2.使用介绍 1).DOM (1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作.优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作:缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理. (2)示例代码: 复制代码 代码如下: <?xml version="1.0&quo

  • java对XML文件的解析、节点的增加、删除操作总结

    1.java代码: 主要采用dom来进行操作 复制代码 代码如下: package test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.T

  • 解析Java的可变长参数列表及其使用时的注意点

    Java 可变参数列表 复制代码 代码如下: class A {} 由于所有的类都继承于Object,可以以Object数组为参数的方法: public class parameter { static void printArray(Object[] args){ for(Object obj : args){ System.out.print(obj + " "); } System.out.println(); } public static void main(String[]

  • 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中使用开源库JSoup解析HTML文件实例

    HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的.你的浏览器会去解析HTML并替你去渲染它们.不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用Java编程多年了,我相信你肯定试过去解析XML,也使用过类似DOM或者SAX这样的解析器,不过很有可能你从未进行过任何的HTML解析的工作.更讽刺的是,在Jav

  • 基于Java中字符串内存位置详解

    前言 之前写过一篇关于JVM内存区域划分的文章,但是昨天接到蚂蚁金服的面试,问到JVM相关的内容,解释一下JVM的内存区域划分,这部分答得还不错,但是后来又问了Java里面String存放的位置,之前只记得String是一个不变的量,应该是要存放在常量池里面的,但是后来问到new一个String出来应该是放到哪里的,这个应该是放到堆里面的,后来又问到String的引用是放在什么地方的,当时傻逼的说也是放在堆里面的,现在总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,

  • java中字符串转整数及MyAtoi方法的实现

    java中字符串转整数及MyAtoi方法的实现 该题虽然和我们正常使用的字符串转整数的API中函数不一致,但是通过增加了很多额外的边界或者异常处理,可以锻炼算法思维的敏锐性和处理边界异常等问题的能力. 思路:字符串题一般考查的都是边界条件.特殊情况的处理.所以遇到此题一定要问清楚各种条件下的输入输出应该是什么样的. 这里已知的特殊情况有: 能够排除首部的空格,从第一个非空字符开始计算 允许数字以正负号(+-)开头 遇到非法字符便停止转换,返回当前已经转换的值,如果开头就是非法字符则返回0 在转换

  • Java中的static关键字全面解析

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

  • Java中迭代器Iterator的使用解析

    什么是迭代器 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果. 在Iterator接口中定义了三个方法: Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍历数据的方法,即用Iterator迭代器,虽然Iterator

  • Java中字符串的一些常见方法分享

    1.Java中字符串的一些常见方法 复制代码 代码如下: /** *  */package com.you.model; /** * @author Administrator * @date 2014-02-24 */public class Replace { /**  * @param args  */ public static void main(String[] args)  {  /**   * 原字符串   */  String str = "78454545855ksdjnf

  • 浅谈java中字符串数组、字符串、整形之间的转换

    字符串数组转字符串(只能通过for循环): String[] str = {"abc", "bcd", "def"}; StringBuffer sB = new StringBuffer(); for (int i = 0; i < str.length;i++) { sB.append(str[i]); } String s = sB.toString(); 字符数组转字符串可以通过下面的方式: char[] data = {"

  • 基于Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof()) indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1. 如果 startindex 是负数,则 startindex 被当作零.如果它比最大的字符位置索引还大,则它被当作最大的可能索引. Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(St

  • Java中字符串中连续相同字符去重方法

    最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到的类名什么的了.总之就是面试没有过了. 回来再网上搜了搜,本来以为可以很容易找到相应的内容,可是找了半天没有找到我想要的结果.后来在某个相似问题求助中看到了相应答案,不过还是有所区别,根据该问题的解决思路,最后实现了. 代码如下: public class Test { public static void m

随机推荐