Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
到目前为止,我们只关注于在特定输入字符串中是否 在某个位置 找到匹配。我们从不关心匹配发生在字符串中的 何处。
通过使用 boundary matchers (边界匹配) 指定此类信息,可以使模式匹配更精确。例如,你可能对查找特定单词感兴趣,但前提是它出现在行的开头或结尾。或者你可能想知道匹配是在单词边界上进行,还是在上一个匹配的末尾进行。
下表列出并解释了所有边界匹配器。
边界构造 | 描述 |
---|---|
^ |
行首 |
$ |
行尾 |
\b |
单词边界 |
\B |
非单词边界 |
\A |
输入的开始 |
\G |
上一个匹配的结束 |
\Z |
输入结束但是对于最终终止符(如果有的话) |
\z |
输入结束 |
以下示例演示边界匹配器 ^
和 $
的使用。如上所述,^
匹配一行的开头,$
匹配一行的结尾。
Enter your regex: ^dog$ Enter input string to search: dog I found the text "dog" starting at index 0 and ending at index 3. Enter your regex: ^dog$ Enter input string to search: dog No match found. Enter your regex: \s*dog$ Enter input string to search: dog I found the text " dog" starting at index 0 and ending at index 15. Enter your regex: ^dog\w* Enter input string to search: dogblahblah I found the text "dogblahblah" starting at index 0 and ending at index 11.
第一个示例是成功的,因为模式占用整个输入字符串。第二个示例失败,因为输入字符串在开头包含额外的空格。第三个示例指定一个表达式,该表达式允许无限制的空格,后面是行尾的“dog”。第四个例子要求“dog”出现在一行的开头,后跟无限数量的单词字符。
要检查模式是否在单词边界上开始和结束(与较长字符串中的子字符串相对),只需在任一侧使用 \b
;例如,\bdog\b
Enter your regex: \bdog\b Enter input string to search: The dog plays in the yard. I found the text "dog" starting at index 4 and ending at index 7. Enter your regex: \bdog\b Enter input string to search: The doggie plays in the yard. No match found.
要匹配非字边界上的表达式,请改为使用 \B
:
Enter your regex: \bdog\B Enter input string to search: The dog plays in the yard. No match found. Enter your regex: \bdog\B Enter input string to search: The doggie plays in the yard. I found the text "dog" starting at index 4 and ending at index 7.
要求匹配仅在上一个匹配结束时发生,请使用 \G
:
Enter your regex: dog Enter input string to search: dog dog I found the text "dog" starting at index 0 and ending at index 3. I found the text "dog" starting at index 4 and ending at index 7. Enter your regex: \Gdog Enter input string to search: dog dog I found the text "dog" starting at index 0 and ending at index 3.
这里第二个例子只找到一个匹配,因为第二次匹配项的“dog”没有在上一个匹配结束时开始。