【发布时间】:2014-09-07 23:21:01
【问题描述】:
我有以下代码。据我所知,程序应该打印 0123445。相反,它会打印 01234456。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex2 {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d*");
Matcher m = p.matcher("ab34ef");
boolean b = false;
while(b=m.find()){
System.out.print(m.start() + m.group());
}
System.out.println();
}
}
我认为应该发生以下情况- 由于搜索模式是针对 \d*,
- 它在位置 0 找到命中,但由于命中不是数字,它只打印 0
- 它在位置 1 找到一个匹配项,但又不是数字,而是打印 0
- 在位置 2 找到命中,因为我们正在寻找 \d*,命中是 34,所以它打印 234。
- 移动到位置 4,找到一个匹配项,但由于匹配项不是数字,所以它只打印 4。
- 移动到位置 5,找到一个匹配项,但由于匹配项不是数字,所以它只打印 5。
在这一点上,据我所知,应该完成了。但是由于某种原因,程序也返回了一个 6。
如果有人能解释一下,不胜感激。
【问题讨论】:
-
将打印改为:
System.out.println("pos: "+m.start() + "; match:" + m.group());,你就会明白发生了什么 -
空模式(对于非数字位置有效)匹配“之前”和“之后”字符,因此它也匹配字符串的末尾。