我注意到调用Matcher.lookingAt()
会影响Matcher.find()
。我在代码中运行了lookingAt()
,结果返回true。然后我运行find()
以便可以开始返回匹配项时,我得到了错误。如果我删除lookingAt()
调用,find()
返回true并打印我的匹配项。有人知道为什么吗?
试用版1:
Matcher matches = Pattern.compile("T\\d+").matcher("T234bird");
System.out.println(matches.lookingAt()); //after running this, find() will return false
while (matches.find())
System.out.println(matches.group());
//Output: true
试用版2:
Matcher matches = Pattern.compile("T\\d+").matcher("T234bird");
//System.out.println(matches.lookingAt()); //without this, find() will return true
while (matches.find())
System.out.println(matches.group());
//Output: T234
试用版3:
Matcher matches = Pattern.compile("T\\d+").matcher("T234bird");
while (matches.lookingAt())
System.out.println(matches.group());
//Output: T234 T234 T234 T234 ... till crash
//I understand why this happens. It's not my question but I just included it in case someone may try to suggest it
最终,我要实现的是:首先确认匹配项在字符串的开头,然后将其打印出来。我最终做了:
Matcher matches = Pattern.compile("T\\d+").matcher("T234bird");
if(matches.lookingAt())
System.out.println(matches.group());
//Output: T234
这解决了我的问题,但是我的问题是:有人知道
lookingAt()
为什么影响find()
吗? 最佳答案
在试用版1中,调用lookingAt
与T234
相匹配,并且您随后对find
的调用开始在上一个匹配的末尾寻找匹配项。如果要返回到字符串的开头,则需要调用 Matcher.reset()
。在Matcher.find()的文档中对此进行了解释:
此方法从此匹配器区域的开头开始,或者如果
该方法的先前调用成功,并且匹配器具有
尚未重设,第一个字符与
前一场比赛。
请注意,lookingAt
与start
,end
和group
一起使用,与find
一样,因此,如果您只对字符串的开头感兴趣,则可以这样做:Matcher matches = Pattern.compile("T\\d+").matcher("T234bird");
if (matches.lookingAt())
System.out.println(matches.group());
您必须在这里使用if
而不是while
,因为lookingAt
总是开始在字符串的开头而不是在上一个匹配项的结尾,因此while
会永远循环。