Matcher 类
索引方法
索引方法提供有用的索引值,这些值精确地显示了匹配项在输入字符串中的位置。
public int start()
: 返回上一次匹配的起始索引。public int start(int group)
: 返回上一次匹配操作期间由给定组捕获的子序列的起始索引。public int end()
: 返回匹配的最后一个字符之后的偏移量。public int end(int group)
: 返回上一次匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。
研究方法
研究方法检查输入字符串,并返回一个布尔值,指示是否找到了模式。
public boolean lookingAt()
: 尝试将输入序列从区域的开头开始与模式匹配。public boolean find()
: 尝试查找输入序列中与模式匹配的下一个子序列。public boolean find(int start)
: 重置此匹配器,然后尝试查找输入序列中与模式匹配的下一个子序列,从指定的索引开始。public boolean matches()
: 尝试将整个区域与模式匹配。
替换方法
替换方法是用于替换输入字符串中的文本的有用方法。
public Matcher appendReplacement(StringBuffer sb, String replacement)
: 实现非终端追加和替换步骤。public StringBuilder appendTail(StringBuilder sb)
: 实现终端追加和替换步骤。public String replaceAll(String replacement)
: 将输入序列中与模式匹配的每个子序列替换为给定的替换字符串。public String replaceFirst(String replacement)
: 将输入序列中与模式匹配的第一个子序列替换为给定的替换字符串。public static String quoteReplacement(String s)
: 返回指定字符串的文字替换字符串。此方法生成一个字符串,该字符串将在 Matcher 类的 appendReplacement 方法中用作文字替换 s。生成的字符串将与 s 中的字符序列匹配,这些字符序列被视为文字序列。斜杠 ('\') 和美元符号 ('$') 不会赋予任何特殊含义。
使用 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 日