Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
到目前为止,我们只关心在特定输入字符串中是否找到了匹配项的位置。我们从不关心匹配项在字符串中的位置。
您可以通过使用边界匹配器来使模式匹配更精确。例如,也许您只对找到的特定单词感兴趣,但只有在它出现在行的开头或结尾时才匹配。或者您想知道匹配项是在单词边界上进行的,还是在上一个匹配项的末尾。
以下表格列出并解释了所有的边界匹配器。
边界构造 | 描述 |
---|---|
^ |
行的开头 |
$ |
行的结尾 |
\b |
单词边界 |
\B |
非单词边界 |
\A |
输入的开头 |
\G |
上一个匹配项的结尾 |
\Z |
输入的结尾,但不包括最后的终止符 |
\z |
输入的结尾 |
以下示例演示了使用边界匹配器^
和$
的用法。如上所述,^
匹配行的开头,$
匹配行的结尾。
输入您的正则表达式:^dog$ 输入要搜索的字符串:dog 我发现了文本“dog”,起始索引为0,结束索引为3。 输入您的正则表达式:^dog$ 输入要搜索的字符串: dog 没有找到匹配项。 输入您的正则表达式:\s*dog$ 输入要搜索的字符串: dog 我发现了文本“ dog”,起始索引为0,结束索引为15。 输入您的正则表达式:^dog\w* 输入要搜索的字符串: dogblahblah 我发现了文本“dogblahblah”,起始索引为0,结束索引为11。
第一个示例成功,因为模式占据了整个输入字符串。第二个示例失败,因为输入字符串开头有额外的空格。第三个示例指定了一个允许无限空格的表达式,后面紧跟行尾的“dog”。第四个示例要求“dog”出现在行的开头,后面是无限个单词字符。
要检查模式是否在单词边界上开始和结束(而不是在较长字符串的子字符串上),只需在两侧使用\b
;例如:\bdog\b
输入正则表达式:\bdog\b 输入要搜索的字符串:The dog plays in the yard. 我在索引4处找到了文本“dog”,并在索引7处结束。 输入正则表达式:\bdog\b 输入要搜索的字符串:The doggie plays in the yard. 未找到匹配项。
要在非单词边界上匹配表达式,请使用\B
:
输入正则表达式:\bdog\B 输入要搜索的字符串:The dog plays in the yard. 未找到匹配项。 输入正则表达式:\bdog\B 输入要搜索的字符串:The doggie plays in the yard. 我在索引4处找到了文本“dog”,并在索引7处结束。
要求匹配仅出现在前一个匹配的末尾,请使用\G
:
输入正则表达式:dog 输入要搜索的字符串:dog dog 我在索引0处找到了文本“dog”,并在索引3处结束。 我在索引4处找到了文本“dog”,并在索引7处结束。 输入正则表达式:\Gdog 输入要搜索的字符串:dog dog 我在索引0处找到了文本“dog”,并在索引3处结束。
在第二个示例中,只找到了一个匹配项,因为第二个“dog”的出现不是在前一个匹配项的末尾开始。