一个
Matcher对象允许您对其进行多次查询,以便您可以查找表达式,获取组,再次查找表达式,获取组,等等。
这意味着在每次调用后,它都会保持状态-匹配成功后产生的组以及继续搜索的位置。
当您连续运行两个匹配/查找方法时,您将得到:
matches()
-匹配字符串的开头,设置组。find()
-尝试在先前匹配/找到的出现之后找到模式的下一个出现,设置组。
但是,当然,在您的情况下,文本不包含 两次
出现的模式,仅包含一次。因此,尽管
matches()成功并设置了适当的组,
find()然后无法找到另一个匹配项,并且这些组无效(匹配/查找失败后无法访问这些组)。
这就是为什么您收到错误消息的原因。
现在,如果你只是玩弄这个,看看之间的区别
matches和
find,那么就没有什么错在节目中有他们两个。但是您需要
reset()在它们之间使用,这将导致
find()不要尝试从
matches()停止的位置继续(如果
matches()成功,它将始终失败)。相反,它将从头开始扫描,就好像您有一个全新的一样
Matcher。它会成功并为您提供团体。
但是正如这里的其他答案所暗示的那样,如果您不只是尝试比较
matchesand 的结果
find,而是想要匹配您的模式并获得结果,那么您应该只选择
其中 之一。
matches()
将尝试匹配整个字符串。因此,如果成功,则find()
在它之后运行将永远不会成功-因为它从字符串末尾开始搜索。如果你使用matches()
,你不需要像锚^
,并$
在开始和你的模式的结束。find()
将尝试匹配字符串中的任何位置。它将从左侧开始扫描,但不需要实际的匹配从此处开始。也可以不止一次使用它。lookingAt()
会尝试匹配字符串的开头,但不一定匹配完整的字符串。就像^
在模式开始时有一个锚点一样。
因此,您可以选择其中之一适合自己,然后使用它,然后可以使用组。尝试使用组之前,请始终测试匹配是否成功!



