正则表达式:Matcher类

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

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


import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(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 099SuperJava
group 1 :99
group 2 :SuperJava

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


import java.util.regex.*;
public class MatcherPatternExample{
public static void main(String args[]){
  test();
}
public static void test(){
 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 class MatcherStartExample{
public static void main(String args[]){
  test();
}
public static void test(){
 //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 class MatcherGroupExample{
 public static void main(String args[]){
     test();
 }
 public static void test(){
    //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 class MatcherGroupParamExample{
 public static void main(String args[]){
    test();
 }
 public static void test(){
    //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 = new StringBuffer();
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想对应很容易理解,就是只替换第一个匹配的。

时间: 2024-10-08 16:35:30

正则表达式:Matcher类的相关文章

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

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

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

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

Java基础知识强化78:正则表达式之获取功能(Pattern 和 Matcher类的使用)

1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: 1 package cn.itcast_05; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 /* 7 * 获取功能 8 * Pattern和Matcher类的使用 9 * 10 * 模式和匹配器的基本使用顺序 11 */ 12 public class RegexDemo { 13 public static v

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

一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式((A)(B(C)))中,存在四个这样的组: 1     ((A)(B(C))) 2     (A) 3     (B(C)) 4     (C) 组零始终代表整个表达式. 以(?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数. 与组关联的捕获输入始终是与组最近匹配的子序列.如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba&

Java正则表达式Pattern和Matcher类

转载自--小鱼儿是坏蛋(原文链接) 概述 Pattern类的作用在于编译正则表达式后创建一个匹配模式.    Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配 Pattern类常用方法及介绍 1.  Pattern complie(String regex)    由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表 达式编译并赋予给Pattern类 2.  String pattern

Java中正则表达式以及Pattern和Matcher类

正则表达式  正则表达式就是正确规则的表达式,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,就是一种规则的应用. 规则字符在java.util.regex Pattern类中字符 x 字符 x.举例:'a’表示字符a\ 反斜线字符.\n 新行(换行)符 (’\u000A’)\r 回车符 (’\u000D’)字符类 [abc] a.b 或 c(简单类)[^abc] 任何字符,除了 a.b 或 c(否定)[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)[0-

java中使用Pattern类中和Matcher类进行查找和替换,你会吗?

前言 无论是哪一门语言,我们总会用到正则表达式来进行字符串的查找和替换.Java中也不为过,我曾经写过一个网页---正则表达式在线测试.那时候,我还没有开始学习Java,不知道Java支持正则表达式,所以我的第一个方案是想办法将数据传输到后台,然后利用Shell脚本正则表达式得到匹配结果.如果后来真的那么做了,那就二了.后来我研究了以下别的类似的网站,发现甚至连js文件都不用写,直接将函数写在html文件中就能够完成这一个任务.一天的时间,我把这个网站给写了出来.所以,即使不是脚本型语言,了解以

[01] Pattern类和Matcher类

在Java中,有个java.util.regex包,这是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它主要有两个类: Pattern   一个正则表达式经编译后的表现模式,可以理解为某正则的对应类 Matcher  匹配检查器,根据Pattern对象作为匹配模式对字符串进行匹配检查 1.Pattern 1.1 获取Pattern对象 Pattern类用于创建一个正则表达式,或者说创建一个匹配模式对象,我们不能直接创建,需要使用其静态方法compile实现: static Pat

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组 最近看了一段解析URL以判断支付方式是在线支付还是具体哪个网银或支付宝的代码.如下 private String[] getAction(String url){ String action = null; String pluginid = null; String pattern = "/(\\w+)_(\\w+)_(\\w+).html(.*)"; Pattern p = Pattern.comp