9 Matcher 类的方法

优质
小牛编辑
135浏览
2023-12-01

在这一节中来看看 Matcher 类中其他一些有用的方法。方便起见,下面列出的方法是按照功能来分组的。

索引方法

索引方法(index methods)提供了一些正好在输入字符串中发现匹配的索引值:

研究方法

研究方法(study methods)回顾输入的字符串,并且返回一个用于指示是否找到模式的布尔值。

替换方法

替换方法(replacement methods)用于在输入的字符串中替换文本有用处的方法。

9.1 使用 start 和 end 方法

示例程序 MatcherDemo.java 用于计算输入序列中单词“dog”的出现次数。

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
 
public class MatcherDemo { 
 
    private static final String REGEX = "\\bdog\\b"; 
    private static final String INPUT = "dog dog dog doggie dogg"; 
 
    public static void main(String[] args) { 
       Pattern p = Pattern.compile(REGEX); 
       Matcher m = p.matcher(INPUT);        // 获得匹配器对象 
       int count = 0; 
       while (m.find()) { 
           count++; 
           System.out.println("Match number " + count); 
           System.out.println("start(): " + m.start()); 
           System.out.println("end(): " + m.end()); 
       } 
    } 
}

输出:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11

可以看出,这个例子使用了单词边界,用于确保更长单词中的字母“d”“o”“g”就不是子串了。它也输出了一些有用的信息,在输入的字符串中什么地方
有匹配。start 方法返回在以前的匹配操作期间,由给定组所捕获子序列的开始处索引,end 方法返回匹配到最后一个字符索引加 1。

9.2 使用 matches 和 lookingAt 方法

matches 和 lookingAt 方法都是尝试该模式匹配输入序列。然而不同的是,matches 要求匹配整个输入字符串,而 lookingAt 不是这样。这两个方法都是从输入字符串的开头开始的。下面是 MatchesLooking.java 完整的代码:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
 
public class MatchesLooking { 
 
    private static final String REGEX = "foo"; 
    private static final String INPUT = "fooooooooooooooooo"; 
    private static Pattern pattern; 
    private static Matcher matcher; 
 
    public static void main(String[] args) { 
    
        // 初始化 
        pattern = Pattern.compile(REGEX); 
        matcher = pattern.matcher(INPUT); 
 
        System.out.println("Current REGEX is: " + REGEX); 
        System.out.println("Current INPUT is: " + INPUT); 
 
        System.out.println("lookingAt(): " + matcher.lookingAt()); 
        System.out.println("matches(): " + matcher.matches()); 
    } 
}

输出:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

9.3 使用 replaceFirst(String) 和 replaceAll(String) 方法

replaceFirst 和 replaceAll 方法替换匹配给定正则表达式的文本。从它们的名字可以看出,replaceFirst 替换第一个匹配到的,而 replaceAll 替换所有匹配的。下面是 ReplaceDemo.java 的代码:

import java.util.regex.Pattern;  
import java.util.regex.Matcher; 
 
public class ReplaceDemo { 
  
    private static String REGEX = "dog"; 
    private static String INPUT = "The dog says meow. All dogs say meow."; 
    private static String REPLACE = "cat"; 
  
    public static void main(String[] args) { 
        Pattern p = Pattern.compile(REGEX); 
        Matcher m = p.matcher(INPUT);       // 获得匹配器对象 
        INPUT = m.replaceAll(REPLACE); 
        System.out.println(INPUT); 
    } 
}

输出:

The cat says meow. All cats say meow.

在上面的例子中,所有的 dog 都被替换成了 cat。但是为什么在这里停下来了呢?你可以替换匹配任何正则表达式的文本,这样优于替换一个简单的像 dog 一样的文字。这个方法的 API 描述了“给定正则表达式a*b,在输入‘aabfooaabfooabfoob’和替换的字符串是‘-’情况下,表达式的匹配器调用方法后,会产生成字符串‘-foo-foo-foo-’。”

下面是 ReplaceDemo2.java 的代码:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
  
public class ReplaceDemo2 { 
  
    private static String REGEX = "a*b"; 
    private static String INPUT = "aabfooaabfooabfoob"; 
    private static String REPLACE = "-"; 
  
    public static void main(String[] args) { 
        Pattern p = Pattern.compile(REGEX); 
        Matcher m = p.matcher(INPUT);       // 获得匹配器对象 
        INPUT = m.replaceAll(REPLACE); 
        System.out.println(INPUT); 
    } 
}

输出:

-foo-foo-foo-

仅要替换模式一次时,可以简单地调用 replaceFirst 用于取代 replaceAll,它接受相同的参数。

9.4 使用 appendReplacement(StringBuffer, String) 和 appendTail(StringBuffer) 方法

Matcher 类也提供了 appendReplacement 和 appendTail 两个方法用于文本替换。下面的这个例子(RegexDemo.java)使用了这两个方法完成与 replaceAll 相同的功能。

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
 
public class RegexDemo { 
  
    private static String REGEX = "a*b"; 
    private static String INPUT = "aabfooaabfooabfoob"; 
    private static String REPLACE = "-"; 
  
    public static void main(String[] args) { 
        Pattern p = Pattern.compile(REGEX); 
        Matcher m = p.matcher(INPUT);       // 获得匹配器对象 
        StringBuffer sb = new StringBuffer(); 
        while (m.find()) { 
            m.appendReplacement(sb, REPLACE); 
        } 
        m.appendTail(sb); 
        System.out.println(sb.toString()); 
    } 
}

输出:

-foo-foo-foo-

9.5 在 java.lang.String 中等价的 Matcher 方法

为了使用方便,String 类看上去还不错地模仿了 Matcher 的两个方法: