Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
本节介绍 Matcher
类的一些其他有用方法。为方便起见,下面列出的方法根据功能进行分组。
Index methods (索引方法) 提供有用的索引值,可以精确显示在输入字符串中找到匹配的位置:
public int start()
:返回上一个匹配的起始索引。public int start(int group)
:返回上一个匹配操作期间给定组捕获的子序列的起始索引。public int end()
:返回最后一个字符匹配后的偏移量。public int end(int group)
:返回在上一个匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。Study methods (研究方法) 检查输入字符串并返回指示是否找到模式的布尔值。
public boolean lookingAt()
:尝试将从区域开头开始的输入序列与模式匹配。public boolean find()
:尝试查找与模式匹配的输入序列的下一个子序列。public boolean find(int start)
:重置此匹配器,然后尝试从指定的索引处开始查找与模式匹配的输入序列的下一个子序列。public boolean matches()
:尝试将整个区域与模式匹配。Replacement methods (替换方法) 是替换输入字符串中的文本的有用方法。
public Matcher appendReplacement(StringBuffer sb, String replacement)
:实现非末尾追加和替换步骤。public StringBuffer appendTail(StringBuffer sb)
:实现末尾追加和替换步骤。public String replaceAll(String replacement)
:用给定替换字符串,替换输入序列中与模式匹配的的每个子序列。public String replaceFirst(String replacement)
:用给定的替换字符串,替换与模式匹配的输入序列的第一个子序列。public static String quoteReplacement(String s)
:返回指定 String
的文字替换 String
。此方法生成 String
,它将作为 Matcher
类的 appendReplacement
方法中的文字替换 s
。生成的 String
将匹配 s
中作为文字序列处理的字符序列。斜线('\'
)和美元符号('$'
)将不具有特殊意义。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); // 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。
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) { // 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
。但为何停在这里?你可以替换匹配 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
类还提供 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
中的匹配方法等价物为方便起见,String
类也模仿了几个 Matcher
方法:
public String replaceFirst(String regex, String replacement)
:将此字符串中与给定正则表达式匹配的的第一个子字符串替换为给定的 replacement。调用 str.replaceFirst(regex, repl)
形式的此方法会产生与表达式 Pattern.compile(regex).matcher(str).replaceFirst(repl)
相同的结果。public String replaceAll(String regex, String replacement)
:将此字符串中与给定正则表达式匹配的的每一个子字符串替换为给定的 replacement。调用 str.replaceAll(regex, repl)
形式的此方法会产生与表达式 Pattern.compile(regex).matcher(str).replaceAll(repl)
完全相同的结果。