(二)Java Matcher类----java正则

记一些知识。。。

Java Matcher类

Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查,此类的实例用于多个并发线程是不安全的。

public final class Matcher extends Object implements MatchResult

实例获取

其构造器也是私有的,可通过静态方法Pattern.matcher(CharSequence input)得到该类的实例. 

方法

Pattern pattern()

pattern()返回parentPattern,返回由此匹配器解释的模式,即构造器传入的Pattern对象。

int groupCount()

返回此匹配器模式中的捕获组数。根据惯例,零组表示整个模式。

Pattern p = Pattern.compile("(\\w+)%(\\d+)");
Matcher m = p.matcher("ab%12-cd%34");
System.out.println(m.groupCount());// 2

String group()

返回当前查找而获得的与组匹配的所有子串内容。group()实际调用了group(int group)方法,参数group为0。组零表示整个模式。

String group(int group)

返回当前查找而获得的与组匹配的所有子串内容。

int start()

返回当前匹配的子串的第一个字符在目标字符串中的索引位置 。start()方法返回的是匹配器的状态first。

int start(int group)

返回当前匹配的指定组中的子串的第一个字符在目标字符串中的索引位置 。

int end()

返回当前匹配的子串的最后一个字符的下一个位置在目标字符串中的索引位置 。end()方法返回的是匹配器的状态last。

int end(int group)

返回当前匹配的的指定组中的子串的最后一个字符的下一个位置在目标字符串中的索引位置 。

boolean find()

在目标字符串里查找下一个匹配子串。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。 

boolean find(int start)

重置此匹配器,然后尝试查找匹配该模式,从指定的位置开始查找下一个匹配的子串。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

int regionStart()

报告此匹配器区域的开始索引。end()方法返回的是匹配器的状态from。

int regionEnd()

报告此匹配器区域的结束索引(不包括)。end()方法返回的是匹配器的状态to。

Matcher region(int start,int end)

设置此匹配器的区域限制。重置匹配器,然后设置区域,使其从 start 参数指定的索引开始,到 end 参数指定的索引结束(不包括end索引处的字符)。 

boolean lookingAt()

从目标字符串开始位置进行匹配。只有在有匹配且匹配的某一子串中包含目标字符串第一个字符的情况下才会返回true。

boolean matches()

只有完全匹配时才会返回true。 matches是整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False。但如果前部分匹配成功,将移动下次匹配的位置。

Matcher appendReplacement(StringBuffer sb, String replacement) 

将当前匹配子串替换为指定字符串,并将从上次匹配结束后到本次匹配结束后之间的字符串添加到一个StringBuffer对象中,最后返回其字符串表示形式。

StringBuffer appendTail(StringBuffer sb)

将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 

String replaceAll(String replacement)

将匹配的子串用指定的字符串替换。

String replaceFirst(String replacement)

将匹配的第一个子串用指定的字符串替换。

Matcher usePattern(Pattern newPattern)

更改匹配器的匹配模式。 

public static void main(String[] args) {
    Pattern p = Pattern.compile("[a-z]+");
    Matcher m = p.matcher("111aaa222");
    System.out.println(piPei(m)); // (模式[a-z]+):匹配子串:aaa;开始位置:3;结束位置:6;
    m.usePattern(Pattern.compile("\\d+")); //更改匹配模式
    System.out.println(piPei(m)); // (模式\d+):匹配子串:222;开始位置:6;结束位置:9;
}

public static String piPei(Matcher m) {
    StringBuffer s = new StringBuffer();
    while (m.find()) {
        s.append("匹配子串:" + m.group() + ";");
        s.append("开始位置:" + m.start() + ";");
        s.append("结束位置:" + m.end() + ";");
    }
    if (s.length() == 0) {
        s.append("没有匹配到!");
    }
    s.insert(0, "(模式" + m.pattern().pattern() + "):");
    return s.toString();
}

总结

1. Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例. 
2. 一个Matcher实例是被用来对目标字符串进行基于既有模式(也就是一个给定的Pattern所编译的正则表达式)进行匹配查找的,所有往Matcher的输入都是通过CharSequence接口提供的,这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作

1. matches是整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False。但如果前部分匹配成功,将移动下次匹配的位置。lookingAt是部分匹配,总是从第一个字符进行匹配,匹配成功了不再继续匹配,匹配失败了,也不继续匹配。find是部分匹配,从当前位置开始匹配,找到一个匹配的子串,将移动下次匹配的位置。

2. Mathcher的find和lookingAt()方法执行成功之后,会影响后续的find的执行,因为下一次find会从上次匹配成功的位置开始继续查找,如果不想这样可以使用reset()方法复原匹配器的状态。

例子

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatcherTest {
    public static void main(String[] args){
        Pattern pattern = Pattern.compile("\\d{3,5}");
        String charSequence = "123-34345-234-00";
        Matcher matcher = pattern.matcher(charSequence);
 
        //虽然匹配失败,但由于charSequence里面的"123"和pattern是匹配的,所以下次的匹配从位置4开始
        print(matcher.matches());
        //测试匹配位置
        matcher.find();
        print(matcher.start());
 
        //使用reset方法重置匹配位置
        matcher.reset();
 
        //第一次find匹配以及匹配的目标和匹配的起始位置
        print(matcher.find());
        print(matcher.group()+" - "+matcher.start());
        //第二次find匹配以及匹配的目标和匹配的起始位置
        print(matcher.find());
        print(matcher.group()+" - "+matcher.start());
 
        //第一次lookingAt匹配以及匹配的目标和匹配的起始位置
        print(matcher.lookingAt());
        print(matcher.group()+" - "+matcher.start());
 
        //第二次lookingAt匹配以及匹配的目标和匹配的起始位置
        print(matcher.lookingAt());
        print(matcher.group()+" - "+matcher.start());
    }
    public static void print(Object o){
        System.out.println(o);
    }
}

结果:

false
4
true
123 - 0
true
34345 - 4
true
123 - 0
true
123 - 0

 

posted @ 2020-10-13 17:24  DurianTRY  阅读(6866)  评论(0编辑  收藏  举报