Matcher 类应用(1)

可以通过 Pattern 类的 matcher(CharSequence input) 方法,创建匹配给定输入与此模式的匹配器。匹配器创建后,可以使用它执行三种不同的匹配操作:

  • matches:方法尝试将整个输入序列与该模式匹配 

  • lookingAt:尝试将输入序列从头开始与该模式匹配

  • find:方法扫描输入序列以查找与该模式匹配的下一个子序列

matches 方法

尝试将整个输入字符序列与模式匹配。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。 

注意:当且仅当整个输入字符序列匹配此匹配器的模式时才返回 true。

实例:使用模式完全匹配 “Hello world.” 文本,代码如下:

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

public class Demo18 {

    public static void main(String[] args) {
        String str = "Hello world.";
        Pattern pattern = Pattern.compile("([a-zA-Z0-9]+)\\s+([a-z]+)\\.");
        Matcher matcher = pattern.matcher(str);
        if(matcher.matches()) {
            System.out.println("匹配成功");
            System.out.println("分组数:" + matcher.groupCount());
            // 下标为0的分组为主分组
            System.out.println("主分组:" + matcher.group(0));
            for(int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("分组" + i + ": " + matcher.group(i));
            }
        } else {
            System.out.println("匹配失败");
        }

        // 验证是否匹配整个输入字符序列
        System.out.println( pattern.matcher("Hello world. regex test")
                .matches() ? "匹配成功" : "匹配失败");
    }

}

运行结果如下:

匹配成功
分组数:2
主分组:Hello world.
分组1: Hello
分组2: world
匹配失败

lookingAt 方法

该方法尝试将从区域开头开始的输入序列与该模式匹配。与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

注意:当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。

实例:匹配所有已 “Hello” 开头行。代码如下:

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

public class Demo19 {

    public static void main(String[] args) {
        String str = "Hello world. regex test";
        Pattern pattern = Pattern.compile("([a-zA-Z0-9]+)\\s+([a-z]+)\\.");
        Matcher matcher = pattern.matcher(str);
        if(matcher.lookingAt()) {
            System.out.println(matcher.group()
                    + " 位置:[" + matcher.start() + ", " + matcher.end() + "]");
        }

        // 验证 lookingAt 是不是前缀匹配
        matcher = pattern.matcher("hi! Hello world.");
        if(matcher.lookingAt()) {
            System.out.println(matcher.group()
                    + " 位置:[" + matcher.start() + ", " + matcher.end() + "]");
        }
    }

}

运行结果如下:

Hello world. 位置:[0, 12]

从上面结果可知,lookingAt() 方法匹配字符串的前缀。第二次调用 matcher 的参数为 “hi! Hello world.”,开头并不匹配 “([a-zA-Z0-9]+)\\s+([a-z]+)\\.” 模式。

find 方法

该方法尝试查找与该模式匹配的输入序列的下一个子序列。此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

注意:当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。

实例:

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

public class Demo20 {

    public static void main(String[] args) {
        String str = "Be honest rather clever\r\n" +
                "Being on sea, sail; being on land, settle\r\n" +
                "Be just to all, but trust not all\r\n" +
                "Believe not all that you see nor half what you hear\r\n" +
                "Be slow to promise and quick to perform\r\n" +
                "Between two stools one falls to the ground\r\n" +
                "Better an open enemy than a false friend";
        Pattern pattern = Pattern.compile("\\s+t[a-z]*o\\s+", Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            System.out.println(matcher.group()
                    + " 位置:[" + matcher.start() + ", " + matcher.end() + "]");
        }
    }

}

运行结果如下:

 to  位置:[75, 79]
 to  位置:[163, 167]
 to  位置:[184, 188]
 two  位置:[204, 209]
 to  位置:[225, 229]
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号