我需要帮助才能理解下面代码的输出。我无法弄清楚System.out.print(m.start() + m.group());
的输出。请有人向我解释一下吗?
import java.util.regex.*;
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.println(m.start() + m.group());
}
}
}
输出是:
0
1
234
4
5
6
请注意,如果我放System.out.println(m.start() );
,则输出为:
0
1
2
4
5
6
答案 0 :(得分:5)
因为您已包含*
字符,所以您的模式也会匹配空字符串。当我更改代码as I suggested in the comments时,我得到以下输出:
0 ()
1 ()
2 (34)
4 ()
5 ()
6 ()
所以你有大量空匹配(匹配字符串中的每个位置),但34
除外,它匹配数字串。如果您想匹配数字而不匹配空字符串,请使用\\d+
。
答案 1 :(得分:2)
你使用了这个正则表达式 - \d*
- 这基本上意味着零或更多数字。注意零!
因此,此模式将匹配任何数字组,例如34
加上字符串中的任何其他位置,匹配的序列将为空字符串。
所以,你将有6场比赛,从指数0,1,2,4,5,6开始。对于从索引2开始的匹配,匹配的序列为34
,而对于其余的匹配序列,匹配将为空字符串。
如果您只想查找数字,可能需要使用此模式:\d+
答案 2 :(得分:1)
d * - 匹配表达式中的零个或多个数字。
expresion ab34ef 及其相应指数 012345
在零指数上没有匹配所以 start()打印0并且 group()打印任何内容,然后在第一个索引1上没有任何内容,在第二个索引上我们找到匹配因此它打印2和34.接下来它将打印4而没有任何东西等等。
另一个例子:
Pattern pattern = Pattern.compile("\\d\\d");
Matcher matcher = pattern.matcher("123ddc2ab23");
while(matcher.find()) {
System.out.println("start:" + matcher.start() + " end:" + matcher.end() + " group:" + matcher.group() + ";");
}
将打印:
start:0 end:2 group:12;
start:9 end:11 group:23;
您可以在tutorial
中找到更多信息