Matcher 类应用(2)

前面章节介绍了 Matcher 类的 matches、 lookingAt 和 find 三个方法。本章节将介绍 Matcher 位置相关的方法,如下:

start()、end() 和 group() 方法

使用 find() 方法将尝试查找与该模式匹配的输入序列的下一个子序列。如果 find() 方法返回 true,则说明匹配到了一个子序列。我们就可以利用 start()、end() 和 group() 三个方法获取子序列的详细信息。如下:

  • String group():返回由以前匹配操作(这里是 find() 方法)所匹配的输入子序列

  • int start():返回以前匹配子序列的初始索引

  • int end():返回最后匹配字符之后的偏移量

实例:使用多行模式匹配多行文本中,每行以 “t” 字符开头,“o” 字符结束,t 和 o 字符之间存在零个或一个 a~z 的字符序列。注意:字符 t 的前面必须紧跟空格,字符 o 的后面必须紧跟空格。代码如下:

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

public class Demo21 {

    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]

start(int)、end(int) 和 group(int) 使用

上面以及介绍了不带参数的 start()、end() 和 group() 方法,它们用来获取调用匹配方法后匹配到的子序列的详细信息。而带有参数的它们可以获取给定分组的详细信息,定义如下:

  • int groupCount():返回此匹配器模式中的捕获组数

  • String group(int group):返回在以前匹配操作期间由给定组捕获的输入子序列

  • int start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引

  • int end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量

实例:使用多个分组语法来匹配 “Hello World” 文本,然后通过 groupCount() 来迭代出每个分组的详细信息。代码如下:

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

public class Demo22 {

    public static void main(String[] args) {
        String str = "Hello World";
        Pattern pattern = Pattern.compile("((Hello)\\s(World))");
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()) {
            System.out.println("分组数:" + matcher.groupCount());
            // 根据分组数迭代,注意:分组0永远表示主分组
            for(int i = 1; i <= matcher.groupCount(); i++) {
                // 获取指定分组的起始位置,以及分组匹配的内容
                System.out.println(matcher.group(i)
                        + " 位置:[" + matcher.start(i) + ", " + matcher.end(i) + "]");
            }
        }
    }

}

运行结果如下:

分组数:3
Hello World 位置:[0, 11]
Hello 位置:[0, 5]
World 位置:[6, 11]
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号