文档

Java™ 教程-Java Tutorials 中文版
Matcher 类的方法
Trail: Essential Classes
Lesson: Regular Expressions

Matcher 类的方法

本节介绍 Matcher 类的一些其他有用方法。为方便起见,下面列出的方法根据功能进行分组。

索引方法

Index methods (索引方法) 提供有用的索引值,可以精确显示在输入字符串中找到匹配的位置:

研究方法

Study methods (研究方法) 检查输入字符串并返回指示是否找到模式的布尔值。

替换方法

Replacement methods (替换方法) 是替换输入字符串中的文本的有用方法。

使用 startend 方法

这是一个例子,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);
       //  get a matcher object
       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());
      }
   }
}

OUTPUT:

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。

使用 matcheslookingAt 方法

matcheslookingAt 方法都尝试将输入序列与模式匹配。但是,差异在于 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) {
   
        // Initialize
        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

使用 replaceFirst(String)replaceAll(String)

replaceFirstreplaceAll 方法替换与给定正则表达式匹配的文本。如其名称所示,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);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

OUTPUT: The cat says meow. All cats say meow.

在第一个版本中,所有匹配项的 dog 都替换为 cat。但为何停在这里?你可以替换匹配 any (任何) 正则表达式的文本,而不是替换像 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);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

OUTPUT: -foo-foo-foo-

要仅替换模式的第一个匹配项,只需调用 replaceFirst 替换 replaceAll。它接受相同的参数。

使用 appendReplacement(StringBuffer,String)appendTail(StringBuffer)

Matcher 类还提供 appendReplacementappendTail 方法以进行文本替换。以下示例 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); // get a matcher object
        StringBuffer sb = new StringBuffer();
        while(m.find()){
            m.appendReplacement(sb,REPLACE);
        }
        m.appendTail(sb);
        System.out.println(sb.toString());
    }
}


OUTPUT: -foo-foo-foo- 

java.lang.String 中的匹配方法等价物

为方便起见,String 类也模仿了几个 Matcher 方法:


Previous page: Methods of the Pattern Class
Next page: Methods of the PatternSyntaxException Class