Matcher 类的方法
本节介绍了Matcher
类的一些其他有用方法。为了方便起见,下面列出的方法根据功能进行了分组。
Index Methods
索引方法提供有用的索引值,这些值精确显示在 Importing 字符串 中找到匹配项的位置:
-
public int start():返回上一个匹配项的起始索引。
-
public int start(int 组):返回在上一次匹配操作期间给定组catch的子序列的起始索引。
-
public int end():返回匹配的最后一个字符后的offset量。
-
公共 int 结束(int 组):在上一次匹配操作期间,返回给定组catch的子序列的最后一个字符后的offset量。
Study Methods
研究方法检查 Importing 字符串,并返回一个布尔值,指示是否找到该 Pattern。
-
布尔 boolean lookingAt():try从区域的开头开始将 Importing 序列与 Pattern 进行匹配。
-
公共布尔 find():try查找与 Pattern 匹配的 Importing 序列的下一个子序列。
-
公共布尔查找(int 开始):重置此匹配器,然后try从指定的索引开始查找与 Pattern 匹配的 Importing 序列的下一个子序列。
-
布尔布尔 Match():try根据图案匹配整个区域。
Replacement Methods
替换方法是用于替换 Importing 字符串 中的文本的有用方法。
-
公共 Matcher appendReplacement(StringBuffer sb,字符串 替换):实现非终端的附加和替换步骤。
-
公共 StringBuffer appendTail(StringBuffer sb):实现终端附加和替换步骤。
-
公共字符串replaceAll(字符串 替换):使用给定的替换字符串 替换与 Pattern 匹配的 Importing 序列的每个子序列。
-
公共字符串replaceFirst(字符串 替换):使用给定的替换字符串 替换与 Pattern 匹配的 Importing 序列的第一个子序列。
-
公共静态字符串quoteReplacement(String s):为指定的
String
返回 Literals 替换String
。此方法产生一个String
,它将作为Matcher
类的appendReplacement
方法中的 Literals 替换s
。产生的String
将与被视为 Literals 序列的s
中的字符序列匹配。斜杠('\'
)和美元符号('$'
)没有特殊含义。
使用开始和结束方法
这是一个示例MatcherDemo.java,它计算单词“ dog”在 Importing 字符串 中出现的次数。
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"
不仅仅是较 Long 单词中的子字符串。它还提供了一些有用的信息,说明匹配在 Importing 字符串 中的何处发生。 start
方法返回在上一次匹配操作期间给定组catch的子序列的起始索引,而end
返回最后匹配的字符的索引加 1.
使用匹配项和 lookingAt 方法
matches
和lookingAt
方法都try将 Importing 序列与 Pattern 进行匹配。但是,区别在于matches
要求匹配整个 Importing 序列,而lookingAt
则不需要。这两种方法总是从 Importing 字符串 的开头开始。这是完整的代码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)
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);
// 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
代替。但是为什么在这里停下来?您可以替换与任何正则表达式匹配的文本,而不是替换dog
这样的简单 Literals。此方法的 API 指出“给定正则表达式a*b
,Importingaabfooaabfooabfoob
和替换字符串-
,对该表达式在匹配器上调用此方法将产生字符串-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-
要仅替换 Pattern 的第一次出现,只需调用replaceFirst
而不是replaceAll
即可。它接受相同的参数。
使用 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); // 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 中的 Matcher 方法等效项
为了方便起见,String
类也模仿了Matcher
个方法:
-
公共字符串replaceFirst(字符串 正则表达式,字符串 替换):使用给定的替换项替换与给定的正则表达式匹配的此字符串 的第一个子字符串。以
str.replaceFirst(regex, repl)
形式调用此方法所产生的结果与表达式Pattern.compile(regex).matcher(str).replaceFirst(repl)
完全相同 -
公共字符串replaceAll(字符串 正则表达式,字符串 替换):使用给定的替换项替换此字符串 中与给定的正则表达式匹配的每个子字符串。以
str.replaceAll(regex, repl)
形式调用此方法所产生的结果与表达式Pattern.compile(regex).matcher(str).replaceAll(repl)
完全相同