系列中的上一篇
当前教程
Matcher 类
系列中的下一篇

系列中的上一篇: Pattern 类

系列中的下一篇: PatternSyntaxException 类的 方法

Matcher 类

 

索引方法

索引方法提供有用的索引值,这些值精确地显示了匹配项在输入字符串中的位置。

 

研究方法

研究方法检查输入字符串,并返回一个布尔值,指示是否找到了模式。

 

替换方法

替换方法是用于替换输入字符串中的文本的有用方法。

 

使用 Start 和 End 方法

以下是一个示例,它计算输入字符串中单词“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());
      }
   }
}

运行此代码会产生以下结果。

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() 返回匹配的最后一个字符的索引加一。

 

使用 Matches 和 LookingAt 方法

matches()lookingAt() 方法都尝试将输入序列与模式匹配。但是,不同之处在于 matches() 要求整个输入序列都匹配,而 lookingAt() 则不需要。两种方法始终从输入字符串的开头开始。以下是完整代码

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 和 ReplaceAll

replaceFirst()replaceAll() 方法替换与给定正则表达式匹配的文本。顾名思义,replaceFirst() 替换第一个匹配项,而 replaceAll() 替换所有匹配项。以下是代码

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);
    }
}

运行此代码会产生以下结果。

The cat says meow. All cats say meow.

在这个第一个版本中,所有出现的 dog 都被替换为 cat。但是为什么要止步于此?与其替换像 dog 这样的简单文字,不如替换与任何正则表达式匹配的文本。此方法的 API 指出“给定正则表达式 a*b、输入 aabfooaabfooabfoob 和替换字符串 -,在该表达式匹配器上调用此方法将产生字符串 -foo-foo-foo-”。

让我们编写以下示例。

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);
    }
}

运行此代码会产生以下结果。

-foo-foo-foo-

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

 

使用 AppendReplacement 和 AppendTail

Matcher 类还提供 appendReplacement()appendTail() 方法用于文本替换。以下示例使用这两个方法来实现与 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());
    }
}

运行此代码会产生与之前相同的结果。

-foo-foo-foo-

 

String 中的 Matcher 方法等效项

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

  • public String replaceFirst(String regex, String replacement): 用给定的替换字符串替换此字符串中与给定正则表达式匹配的第一个子字符串。 形式为 string.replaceFirst(regex, repl) 的方法调用与表达式 Pattern.compile(regex).matcher(str).replaceFirst(repl) 的结果完全相同。
  • public String replaceAll(String regex, String replacement): 用给定的替换字符串替换此字符串中与给定正则表达式匹配的每个子字符串。 形式为 string.replaceAll(regex, repl) 的方法调用与表达式 Pattern.compile(regex).matcher(str).replaceAll(repl) 的结果完全相同。

最后更新: 2022 年 1 月 10 日


系列中的上一篇
当前教程
Matcher 类
系列中的下一篇

系列中的上一篇: Pattern 类

系列中的下一篇: PatternSyntaxException 类的 方法