Java对正则表达式的支持主要体现在String、Pattern、Matcher和Scanner类。

 1.Pattern、Matcher

  先看一个Pattern和Matcher类使用正则表达式的例子。

  1. public class PatternTest {
  2.  
  3. public static void main(String [ ] args) {
  4. String testString = "abcabcabcdefabc";
  5. String [] regexs = new String []{"abc+","(abc)+","(abc){2,}"};
  6.  
  7. for(String regex:regexs){
  8. Pattern p = Pattern.compile(regex);
  9. Matcher m = p.matcher(testString);
  10.  
  11. System.out.println("test regex: " + regex);
  12. while(m.find()){
  13. System.out.println("match " + m.group() + " at position " + m.start() + "-" + (m.end() -1));
  14. }
  15. }
  16. }
  17.  
  18. }

  运行的结果为:

  1. test regex: abc+
  2. match abc at position 0-2
  3. match abc at position 3-5
  4. match abc at position 6-8
  5. match abc at position 12-14
  6. test regex: (abc)+
  7. match abcabcabc at position 0-8
  8. match abc at position 12-14
  9. test regex: (abc){2,}
  10. match abcabcabc at position 0-8

  先对几个正则表达式的含义进行解释:

  abc+:匹配abc或者abcc或者abccc等。

  (abc)+:根据贪婪原则,匹配1次或者多次连续的abc,匹配最长的字符串。

  (abc){2,}:abc至少出现2次,匹配abcabc或者abcabcabc等。

  测试一个字符串是否匹配某个正则表达式,可以使用下面的方法:

  1. String testString = "abcabcabcdefabc";
  2. System.out.println(Pattern.matches("abc+", testString));
  3. System.out.println(Pattern.matches("abc+", "abccc"));

  输出结果为:false 和 true。

  查看子匹配的方法如下,使用group方法:

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3.  
  4. public class PatternTest2 {
  5.  
  6. public static void main(String [ ] args) {
  7. String poem = "'Twas brillig,and the slithy toves\n" +
  8. "Did gyre and gimble in the wabe.\n" +
  9. "All mimsy were the borogoves,\n" +
  10. "And the mome raths outgrabe.";
  11.  
  12. Pattern p = Pattern.compile("(?m)(\\S+)\\s(\\S+\\s\\S+)$");
  13. Matcher m = p.matcher(poem);
  14. while(m.find()){
  15. for(int i=0;i<= m.groupCount();i++){
  16. System.out.print("[" + m.group(i) + "]");
  17. }
  18. System.out.println("");
  19. }
  20. }
  21.  
  22. }

  输出的结果为:

  1. [the slithy toves][the][slithy toves]
  2. [in the wabe.][in][the wabe.]
  3. [were the borogoves,][were][the borogoves,]
  4. [mome raths outgrabe.][mome][raths outgrabe.]

  需要解释的是:

  (?m)指明了是多行模式,否则“$”只会指向结尾的位置,加上了(?m),“$”指向每行的结尾位置。

  (\\S+)\\s(\\S+\\s\\S+)$表示每行结尾处的3个字符,需要注意这里面还包含了2个子匹配,代码中用 m.group(i)获取了子匹配的内容。

  

  如果希望在匹配时忽略大小写和支持多行模式,应该使用下面的代码:

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3.  
  4. public class PatternTest3 {
  5.  
  6. public static void main(String [ ] args) {
  7. String testString = "java hava regex\n" +
  8. "JAVA hava regex\n" +
  9. "Java hava regex";
  10.  
  11. Pattern p = Pattern.compile("^java",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
  12. Matcher m = p.matcher(testString);
  13. while(m.find()){
  14. System.out.println(m.group());
  15. }
  16. }
  17. }

  输出结果为:

  1. java
  2. JAVA
  3. Java

  Pattern.CASE_INSENSITIVE(?i)--忽略大小写

  Pattern.MULTILINE(?m)--支持多行模式

  Pattern.COMMENTS(?x)--忽略大小写

  将匹配结果分割成数组,可以使用split方法,String的split方法 也支持正则表达式,如下面的例子:

  1. public class RegexSplit {
  2.  
  3. public static void main(String [ ] args) {
  4. String testString = "This!!unusual use!!of exclamation!!points";
  5.  
  6. Pattern p = Pattern.compile("!!");
  7. String [] sts = p.split(testString);
  8. for(String st:sts){
  9. System.out.print(st +"|");
  10. }
  11. System.out.println();
  12. sts = p.split(testString,3);
  13. for(String st:sts){
  14. System.out.print(st+"|");
  15. }
  16. }
  17.  
  18. }

  正则表达式的替换操作,replaceFirst和replaceAll,复杂的替换操作需要appendReplacement来完成,如下:

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. public class RegexExam {
  7. public static void main(String args[]) {
  8. String template = "尊敬的客户${customerName}你好!本次消费金额${amount},"
  9. + "您帐户${accountNumber}上的余额为${balance},欢迎下次光临!";
  10. HashMap<String, String> data = new HashMap<String, String>();
  11. data.put("customerName", "刘明");
  12. data.put("accountNumber", "888888888");
  13. data.put("balance", "$1000000.00");
  14. data.put("amount", "$1000.00");
  15. try {
  16. System.out.println(composeMessage(template, data));
  17. }
  18. catch (Exception e) {
  19. e.printStackTrace();
  20. }
  21. }
  22.  
  23. public static String composeMessage(String template, Map<String, String> data)
  24. throws Exception {
  25. //这里使用勉强式匹配.+?,使用贪婪式匹配.+结果是不正确的
  26. String regex = "\\$\\{(.+?)\\}";
  27. Pattern pattern = Pattern.compile(regex);
  28. Matcher matcher = pattern.matcher(template);
  29. /*
  30. * sb用来存储替换过的内容,它会把多次处理过的字符串按源字符串序
  31. * 存储起来。
  32. */
  33. StringBuffer sb = new StringBuffer();
  34. while (matcher.find()) {
  35. String name = matcher.group(1);//键名
  36. String value = (String) data.get(name);//键值
  37. if (value == null) {
  38. value = "";
  39. }
  40. else {
  41. /*
  42. * $和\都是特殊字符,表示字符$需要转义\$
  43. * 要把 $ 替换成 \$ ,则要使用 \\\\\\$来替换,java中的\是特殊字符,用\\表示正则表达式中的\
  44. * value的结果仍是一个正则表达式,会在下面使用
  45. */
  46. value = value.replaceAll("\\$", "\\\\\\$");
  47. //System.out.println("value=" + value);
  48. }
  49. /*
  50. * 经过上面的替换操作,现在的 value 中含有 $ 特殊字符的内容被换成了"\$1000.00"
  51. */
  52. matcher.appendReplacement(sb, value);
  53. System.out.println("sb = " + sb.toString());
  54. }
  55. //最后还得要把尾串接到已替换的内容后面去,这里尾串为“,欢迎下次光临!”
  56. matcher.appendTail(sb);
  57. return sb.toString();
  58. }
  59. }

  运行的结果为:

  1. 尊敬的客户刘明你好!本次消费金额$1000.00,您帐户888888888上的余额为$1000000.00,欢迎下次光临!

  重置,将Mathcer对象应用于一个新的字符串:

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3.  
  4. public class RegexReset {
  5.  
  6. public static void main(String [ ] args) {
  7. String str = "fix the rug with bags";
  8.  
  9. Pattern pattern = Pattern.compile("[frb][aiu][gx]");
  10. Matcher matcher = pattern.matcher(str);
  11. while(matcher.find()){
  12. System.out.print(matcher.group() + " ");
  13. }
  14. System.out.println();
  15. matcher.reset("fix the rig with rags");
  16. while(matcher.find()){
  17. System.out.print(matcher.group() + " ");
  18. }
  19. }
  20.  
  21. }

  输出的结果为:

  1. fix rug bag
  2. fix rig rag

Java对正则表达式的支持(一)的更多相关文章

  1. Java对正则表达式的支持(二)

    正则表达式的主要用途: a.在目标字符串中找出匹配正则表达式的部分 b.校验目标字符串是否符合正则表达式,例如校验邮箱地址 c.在目标字符串中替换符合正则表达式的部分为其他的字符串 Scanner类是 ...

  2. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  3. Java与正则表达式

    Java与正则表达式 标签: Java基础 正则 正如正则的名字所显示的是描述了一个规则, 通过这个规则去匹配字符串. 学习正则就是学习正则表达式的语法规则 正则语法 普通字符 字母, 数字, 汉字, ...

  4. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

    简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA ...

  5. java中正则表达式基本用法(转)

    https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...

  6. JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\)

    JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\) 一.总结 js正则:var patrn=/^[0-9]{1,20}$/; php正则:$pattern='/ ...

  7. js and java 中正则表达式的使用

    首先介绍一下js当中的几个关键的正则表达式: 1.js中的正则表达式校验 a: RegExp(如果这里有转义字符的话,需要使用“\\”) var patt1=new RegExp("e&qu ...

  8. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  9. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

随机推荐

  1. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

  2. 51Nod 1632 B君的连通(递归,快速幂)

    1632 B君的连通 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B ...

  3. [51nod1440]迈克打电话

    有n只熊,从1到n进行编号. 第i只熊的电话号码是si.每只熊会给那些电话号码是他的子串的熊打电话(可能会给自己打). call(i, j) 表示第i只熊给第j只熊打电话的次数,也就是第j个串在第i个 ...

  4. BZOJ1226: [SDOI2009]学校食堂Dining

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1226 状压dp. f[i][s][k]表示原顺序中前i-1个人都吃了饭,当前状态为s(i及i之 ...

  5. MongoDb在windows下的安装与以auth方式启用服务

    一.下载安装 1.去官网上下载适合自己电脑的MongoDB版本  下载MongoDB 2.安装MongoDB 安装还是比较简单,按照步骤一步一步往下走就可以了. 3.启动MongodDB 安装完成之后 ...

  6. 根据父节点parentid查询节点信息

    ---恢复内容开始--- SELECT * from  tb3 where pid in(select id from tb1 where parentId ='ce2a98d7a04c4bf6a38 ...

  7. 启动时候报错由于没有扫包 error creating bean with name

    <!-- 扫描包,加载service实现类 --> <context:component-scan base-package="com.taotao.search.serv ...

  8. DEDECMS系统安全篇之移data目录到Web根目录以外听语音

    http://jingyan.baidu.com/article/ad310e80aeb0971849f49e8e.html 主要三个步骤: 1./include/common.inc.php 2.还 ...

  9. isinstance和issubclass、动态模块导入、异常处理

    一.isinstance和issubclass isinstance:判断某个对象是否是某个类的实例,返回True或Flase issubclass:判断某个类是否是某个类的子类. 例如: class ...

  10. 美国不同C段服务器,多ip服务器

    作为多IP服务器的拓展,多C段服务器,例如:IP分为4段,A段,B段,C段,D段.192.168.0.1/24代表着一个C段,可用IP段为192.168.0.1-255,一个C段有253个可用IP.一 ...