理解正则表达式输出

时间:2014-01-03 09:13:48

标签: java regex

我需要帮助才能理解下面代码的输出。我无法弄清楚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

3 个答案:

答案 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

中找到更多信息