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

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

  1. package edu.jlu.fuliang;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class RegexTest {
  5. public static void main(String[] args) {
  6. String regex = "\\w(\\d\\d)(\\w+)";
  7. String candidate = "x99SuperJava";
  8.  
  9. Pattern p = Pattern.compile(regex);
  10. Matcher matcher = p.matcher(candidate);
  11. if(matcher.find()){
  12. int gc = matcher.groupCount();
  13. for(int i = 0; i <= gc; i++)
  14. System.out.println("group " + i + " :" + matcher.group(i));
  15. }
  16. }
  17. }

输出结果:

引用
group 099SuperJava group 1 :99 group 2 :SuperJava

下面我们看看Matcher类提供的方法: public Pattern pattern() 这个方法返回了,创建Matcher的那个pattern对象。
下面我们看看一个小例子来说明这个结果

  1. import java.util.regex.*;
  2. public class MatcherPatternExample{
  3. public static void main(String args[]){
  4. test();
  5. }
  6. public static void test(){
  7. Pattern p = Pattern.compile("\\d");
  8. Matcher m1 = p.matcher("55");
  9. Matcher m2 = p.matcher("fdshfdgdfh");
  10. System.out.println(m1.pattern() == m2.pattern());
  11. //return true
  12. }
  13. }

public Matcher reset() 这个方法将Matcher的状态重新设置为最初的状态。
public Matcher reset(CharSequence input)
重新设置Matcher的状态,并且将候选字符序列设置为input后进行Matcher, 这个方法和重新创建一个Matcher一样,只是这样可以重用以前的对象。
public int start()
这个方法返回了,Matcher所匹配的字符串在整个字符串的的开始下标: 下面我们看看一个小例子

  1. public class MatcherStartExample{
  2. public static void main(String args[]){
  3. test();
  4. }
  5. public static void test(){
  6. //create a Matcher and use the Matcher.start() method
  7. String candidateString = "My name is Bond. James Bond.";
  8. String matchHelper[] =
  9. {" ^"," ^"};
  10. Pattern p = Pattern.compile("Bond");
  11. Matcher matcher = p.matcher(candidateString);
  12. //Find the starting point of the first 'Bond'
  13. matcher.find();
  14. int startIndex = matcher.start();
  15. System.out.println(candidateString);
  16. System.out.println(matchHelper[0] + startIndex);
  17. //Find the starting point of the second 'Bond'
  18. matcher.find();
  19. int nextIndex = matcher.start();
  20. System.out.println(candidateString);
  21. System.out.println(matchHelper[1] + nextIndex);
  22. }

输出结果: 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)操作。
看看下面一个小例子:

  1. import java.util.regex.*;
  2. public class MatcherGroupExample{
  3. public static void main(String args[]){
  4. test();
  5. }
  6. public static void test(){
  7. //create a Pattern
  8. Pattern p = Pattern.compile("Bond");
  9. //create a Matcher and use the Matcher.group() method
  10. String candidateString = "My name is Bond. James Bond.";
  11. Matcher matcher = p.matcher(candidateString);
  12. //extract the group
  13. matcher.find();
  14. System.out.println(matcher.group());
  15. }
  16. }

public String group(int group)
这个方法提供了强大而方便的工具,可以得到指定的group所匹配的输入字符串 因为这两个方法经常使用,同样我们看一个小例子:

  1. import java.util.regex.*;
  2. public class MatcherGroupParamExample{
  3. public static void main(String args[]){
  4. test();
  5. }
  6. public static void test(){
  7. //create a Pattern
  8. Pattern p = Pattern.compile("B(ond)");
  9. //create a Matcher and use the Matcher.group(int) method
  10. String candidateString = "My name is Bond. James Bond.";
  11. //create a helpful index for the sake of output
  12. Matcher matcher = p.matcher(candidateString);
  13. //Find group number 0 of the first find
  14. matcher.find();
  15. String group_0 = matcher.group(0);
  16. String group_1 = matcher.group(1);
  17. System.out.println("Group 0 " + group_0);
  18. System.out.println("Group 1 " + group_1);
  19. System.out.println(candidateString);
  20. //Find group number 1 of the second find
  21. matcher.find();
  22. group_0 = matcher.group(0);
  23. group_1 = matcher.group(1);
  24. System.out.println("Group 0 " + group_0);
  25. System.out.println("Group 1 " + group_1);
  26. System.out.println(candidateString);
  27. }
  28. }
  29. public int groupCount()
  30. 这个方法返回了,正则表达式的匹配的组数。
  31.  
  32. public boolean matches()
  33. 尝试将整个区域与模式匹配。这个要求整个输入字符串都要和正则表达式匹配。
  34. find不同, find是会在整个输入字符串查找匹配的子字符串。
  35. public boolean find()
  36. find会在整个输入中寻找是否有匹配的子字符串,一般我们使用find的流程:
  1. while(matcher.find()){
  2. //在匹配的区域,使用group,replace等进行查看和替换操作
  3. }

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

  1. StringBuffer sb = new StringBuffer();
  2. String replacement = "Smith";
  3. Pattern pattern = Pattern.compile("Bond");
  4. Matcher matcher =pattern.matcher("My name is Bond. James Bond. I would like a martini.");
  5. while(matcher.find()){
  6. matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith
  7. }

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了。 是:

  1. while(matcher.find()){
  2. matcher.appendReplacement(sb,replacement);//结果是My name is Smith. James Smith
  3. }
  4. matcher.appendTail(sb);

的更便捷的方法。

  1. public String replaceFirst(String replacement)

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

Matcher类:(转)的更多相关文章

  1. JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

  2. Java中正则Matcher类的matches()、lookAt()和find()的区别

    在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回 ...

  3. 正则表达式:Pattern类与Matcher类详解

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

  4. JAVA正则表达式:Pattern类与Matcher类详解

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

  5. java14-4 Pattern和Matcher类的使用

     获取功能  Pattern和Matcher类的使用  模式和匹配器的基本使用顺序 import java.util.regex.Matcher; import java.util.regex.Pat ...

  6. Java中正则Matcher类的matches()、lookAt()和find()的区别<转>

    在Matcher类中有matches.lookingAt和find都是匹配目标的方法,但容易混淆,整理它们的区别如下: matches:整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回 ...

  7. Java正则表达式:Pattern类和Matcher类

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

  8. [转] JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和 Matcher Pattern 一个Pattern是一个正则表达式经编译后的 ...

  9. 正则表达式中Pattern类、Matcher类和matches()方法简析

    1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.  它包括两个类:Pattern和Matcher . Pattern: 一个Pattern是一 ...

随机推荐

  1. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

  2. linux软件下载及安装

    1.jdk安装以及下载地址      rpm.tar.gz格式下载   |   bin格式下载 官方bin格式下载   |    安装 2.centos安装phpstorm    戳我

  3. Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

    摘要:     Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Se ...

  4. iOS开发之引用百度地图SDK(一)-----------SDK开发指南

    (void)viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView.delegate = self; // 此处记得不用 ...

  5. golang时间

    //获取本地location toBeCharge := "2015-01-01 00:00:00" //待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板 ...

  6. mysql 前缀索引

    计算适合设置索引的长度,直到去重以后在一个固定值. 根据去重以后适合的长度设置索引. 计划查询

  7. SonarLint插件的安装与使用

    注意:版本要求Eclipse(4.2,3.8)以上,Java3.1.2,JavaScript 2. 一.SonarLint插件的安装方式 1.安装方式一:在线安装 1)Eclipse工具栏选择Help ...

  8. eclipse不能打断点的问题

    今天突然eclipse不能打断点了,按ctrl+左键也不能进行方法导向了.查了很多资料还是不清楚怎么回事. 我把原来的文件再重新复制下,这个副本竟然是正常的. 结论:把原来的文件重新编译生成class ...

  9. 【服务器防护】WEB防护 - WEBSHELL攻击探测【转载】

    原文:http://www.2cto.com/Article/201511/451757.html 1. 什么是webshell?     基于b/s架构的软件部署在Internet上,那么安全性是必 ...

  10. order by 容易出现的bug记录

    写分页查询时遇到一个问题: 在order by create_time 的时候,假设所有数据的create_time 值相同,那么 使用:select * from ( selelct s.*,row ...