Matcher类:

使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中

()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的,

以及这些组和组的下标怎么对应的.

下面我们看看一个小例子,来说明这个问题

引用

\w(\d\d)(\w+)

这个正则表达式有三个组:

整个\w(\d\d)(\w+) 是第0组 group(0)

(\d\d)是第1组 group(1)

(\w+)是第2组 group(2)

我们看看和正则表达式匹配的一个字符串x99SuperJava,

group(0)永远都是匹配整个表达式的字符串的那部分x99SuperJava

group(1)是第1组(\d\d)匹配的部分:99

group(2)是第二组(\w+)匹配的那部分SuperJava

下面我们写一个程序来验证一下:

packageedu.jlu.fuliang;importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classRegexTest {public static voidmain(String[] args) {

String regex= "\\w(\\d\\d)(\\w+)";

String candidate= "x99SuperJava";

Pattern p=Pattern.compile(regex);

Matcher matcher=p.matcher(candidate);if(matcher.find()){int gc =matcher.groupCount();for(int i = 0; i <= gc; i++)

System.out.println("group " + i + " :" +matcher.group(i));

}

}

}

输出结果:

引用

group 0:99SuperJava

group 1 :99

group 2 :SuperJava

下面我们看看Matcher类提供的方法:

public Pattern pattern()

这个方法返回了,创建Matcher的那个pattern对象。

下面我们看看一个小例子来说明这个结果

import java.util.regex.*;public classMatcherPatternExample{public static voidmain(String args[]){

test();

}public static voidtest(){

Pattern p= Pattern.compile("\\d");

Matcher m1= p.matcher("55");

Matcher m2= p.matcher("fdshfdgdfh");

System.out.println(m1.pattern()==m2.pattern());//return true

}

}

public Matcher reset()

这个方法将Matcher的状态重新设置为最初的状态。

public Matcher reset(CharSequence input)

重新设置Matcher的状态,并且将候选字符序列设置为input后进行Matcher,

这个方法和重新创建一个Matcher一样,只是这样可以重用以前的对象。

public int start()

这个方法返回了,Matcher所匹配的字符串在整个字符串的的开始下标:

下面我们看看一个小例子

public classMatcherStartExample{public static voidmain(String args[]){

test();

}public static voidtest(){//create a Matcher and use the Matcher.start() method

String candidateString = "My name is Bond. James Bond.";

String matchHelper[]={" ^"," ^"};

Pattern p= Pattern.compile("Bond");

Matcher matcher=p.matcher(candidateString);//Find the starting point of the first 'Bond'

matcher.find();int startIndex =matcher.start();

System.out.println(candidateString);

System.out.println(matchHelper[0] +startIndex);//Find the starting point of the second 'Bond'

matcher.find();int nextIndex =matcher.start();

System.out.println(candidateString);

System.out.println(matchHelper[1] +nextIndex);

}

输出结果:

My name is Bond. James Bond.

^11

My name is Bond. James Bond.

^23

public int start(int group)

这个方法可以指定你感兴趣的sub group,然后返回sup group匹配的开始位置。

public int end()

这个和start()对应,返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。

其实start和end经常是一起配合使用来返回匹配的子字符串。

public int end(int group)

和public int start(int group)对应,返回在sup group匹配的子字符串最后一个字符在整个字符串下标加一

public String group()

返回由以前匹配操作所匹配的输入子序列。

这个方法提供了强大而方便的工具,他可以等同使用start和end,然后对字符串作substring(start,end)操作。

看看下面一个小例子:

import java.util.regex.*;public classMatcherGroupExample{public static voidmain(String args[]){

test();

}public static voidtest(){//create a Pattern

Pattern p = Pattern.compile("Bond");//create a Matcher and use the Matcher.group() method

String candidateString = "My name is Bond. James Bond.";

Matcher matcher=p.matcher(candidateString);//extract the group

matcher.find();

System.out.println(matcher.group());

}

}

public String group(int group)

这个方法提供了强大而方便的工具,可以得到指定的group所匹配的输入字符串

应为这两个方法经常使用,同样我们看一个小例子

import java.util.regex.*;public classMatcherGroupParamExample{public static voidmain(String args[]){

test();

}public static voidtest(){//create a Pattern

Pattern p = Pattern.compile("B(ond)");//create a Matcher and use the Matcher.group(int) method

String candidateString = "My name is Bond. James Bond.";//create a helpful index for the sake of output

Matcher matcher =p.matcher(candidateString);//Find group number 0 of the first find

matcher.find();

String group_0= matcher.group(0);

String group_1= matcher.group(1);

System.out.println("Group 0 " +group_0);

System.out.println("Group 1 " +group_1);

System.out.println(candidateString);//Find group number 1 of the second find

matcher.find();

group_0= matcher.group(0);

group_1= matcher.group(1);

System.out.println("Group 0 " +group_0);

System.out.println("Group 1 " +group_1);

System.out.println(candidateString);

}

}

public int groupCount()

这个方法返回了,正则表达式的匹配的组数。

public boolean matches()

尝试将整个区域与模式匹配。这个要求整个输入字符串都要和正则表达式匹配。

和find不同, find是会在整个输入字符串查找匹配的子字符串。

public boolean find()

find会在整个输入中寻找是否有匹配的子字符串,一般我们使用find的流程:

while(matcher.find()){//在匹配的区域,使用group,replace等进行查看和替换操作

}

public boolean find(int start)

从输入字符串指定的start位置开始查找。

public boolean lookingAt()

基本上是matches更松约束的一个方法,尝试将从区域开头开始的输入序列与该模式匹配

public Matcher appendReplacement (StringBuffer sb, String replacement)

你想把My name is Bond. James Bond. I would like a martini中的Bond换成Smith

StringBuffer sb = newStringBuffer();

String replacement= "Smith";

Pattern pattern= Pattern.compile("Bond");

Matcher matcher=pattern.matcher("My name is Bond. James Bond. I would like a martini.");while(matcher.find()){

matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith

}

Matcher对象会维护追加的位置,所以我们才能不断地使用appendReplacement来替换所有的匹配。

public StringBuffer appendTail(StringBuffer sb)

这个方法简单的把为匹配的结尾追加到StringBuffer中。在上一个例子的最后再加上一句:

matcher.appendTail(sb);

结果就会成为My name is Smith. James Smith. I would like a martini.

public String replaceAll(String replacement)

这个是一个更方便的方法,如果我们想替换所有的匹配的话,我们可以简单的使用replaceAll就ok了。

while(matcher.find()){

matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith

}

matcher.appendTail(sb);

更便捷的方法:

public String replaceFirst(String replacement)

这个与replaceAll想对应很容易理解,就是只替换第一个匹配的。

java match详解_Match类解析相关推荐

  1. 1、java集合:java集合详解及类关系图

    List和Set继承自Collection接口. Set无序不允许元素重复.HashSet和TreeSet是两个主要的实现类. List有序且允许元素重复,支持null对象.ArrayList.Lin ...

  2. java技术详解_Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...

  3. java源码详解——String类

    java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...

  4. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  5. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解

    以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1        ((A) ...

  6. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  7. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

  8. java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一,大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 对j ...

  9. Java 多线程详解(二)------如何创建进程和线程

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 在上一篇博客中,我们已经 ...

  10. Java集合排序及java集合类详解

    Java集合排序及java集合类详解 (Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分.能够用好集合和理解好集合对于做Java程序的开 ...

最新文章

  1. Percy Liang、李飞飞等百余位学者联名发布:「基础模型」的机遇与挑战
  2. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project
  3. Java黑皮书课后题第6章:*6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序。使用下面的方法体编写一个计算税款的方法。使用这个方法编写程序,打印可征税人从50000到60000间隔
  4. [网络安全提高班] 一〇一.网络攻防溯源普及和医疗数据安全总结
  5. csv文件用excel打开有多行是空的,用sublime打开空白行没有''处理方案
  6. Linux 命令行下载命令 Axel 多线程下载
  7. Atom 编辑器系列视频课程
  8. OpenGL入门(二)之渲染管线pipeline,VAO、VBO和EBO
  9. C语言编程编制职工档案管理程序,C语言课程设计--职工档案及简明信息生成.doc...
  10. [洛谷P2698] [USACO12MAR]花盆Flowerpot
  11. 聚观早报 | 多款热门游戏停服一天;比亚迪下月在日本开售
  12. 中国陶瓷油墨行业市场供需与战略研究报告
  13. 31省消费水平--聚类分析
  14. ios开发之常用代码
  15. js中 浅谈回调地狱 Promise之终极改造代码
  16. 用函数实现比较两个数的大小
  17. win10进不去pe的解决方法
  18. 1 - 4 电路元件
  19. vue普通字符串拼接html,vue中如何拼接字符串
  20. 写日记(周记)的重要性

热门文章

  1. java-枚举类的定义及使用
  2. 论文阅读(9) 鱼类洄游粒子图像测速技术综述 (2016)
  3. UVC app流程图
  4. 产品更新背后的达维多定律
  5. centos7zabbix-agen安装
  6. 适合外贸建站的wordpress模板
  7. Charles手机 APP 抓包仅需这三步
  8. 几张趣图助你理解HTTP状态码
  9. mac删除默认ABC输入法,mac删除自带ABC输入法
  10. 什么是社会融资规模,M0、M1、M2?