为何在while循环前添加if语句会丢失首个正则匹配结果?
问题原因与修正方案:Matcher.find()导致首个匹配项丢失
错误原因
Matcher类的find()方法是有状态的——每次调用它,都会把内部的匹配指针移动到当前匹配结果的下一个字符位置,下次调用就从这个新位置开始查找。
你在while循环前调用了if(m.find()),这一步已经成功匹配到第一个结果"Name",同时指针已经跳到了"Name"后面的逗号位置。当你进入while循环再调用m.find()时,自然从这个新位置开始找,第一个匹配项"Name"就被跳过了。
修正方法
方法一:提前判断时先保存首个匹配结果
如果确实需要先判断是否存在匹配项,再输出所有结果,可以先把第一个匹配项输出,再循环处理剩余的:
Pattern pattern = Pattern.compile("[a-zA-Z0-9]+"); Matcher matcher = pattern.matcher("Name, 245 Street, City, Country, 101010"); if (matcher.find()) { // 先输出第一个匹配到的内容 System.out.println(matcher.group()); // 循环处理剩下的匹配项 while (matcher.find()) { System.out.println(matcher.group()); } }
方法二:直接使用while循环(推荐)
其实你最初的写法就是正确的——while(m.find())会自动处理"是否存在匹配项"的判断:如果没有匹配结果,循环直接不执行;如果有,就从字符串开头开始逐个匹配输出。完全没必要额外加if判断:
Pattern pattern = Pattern.compile("[a-zA-Z0-9]+"); Matcher matcher = pattern.matcher("Name, 245 Street, City, Country, 101010"); while (matcher.find()) { System.out.println(matcher.group()); }
方法三:重置Matcher状态(不推荐)
也可以用reset()方法把Matcher的内部指针重置回字符串开头,但这种写法多此一举,会增加代码复杂度,仅作了解:
Pattern pattern = Pattern.compile("[a-zA-Z0-9]+"); Matcher matcher = pattern.matcher("Name, 245 Street, City, Country, 101010"); if (matcher.find()) { matcher.reset(); // 重置指针到字符串起始位置 while (matcher.find()) { System.out.println(matcher.group()); } }
内容的提问来源于stack exchange,提问作者Norman
相关产品推荐
相关产品推荐

