正则表达式搜索超出字符串边界

时间:2015-06-03 07:18:12

标签: java regex string

代码如下:

import java.util.regex.*;

public class RegEx {

    public static void main(String[] args) {

        Pattern p = Pattern.compile("\\d*");
        Matcher m = p.matcher("ab56ef");
        System.out.println("Pattern is " + m.pattern());
        while (m.find()) {
            System.out.print("index: " + m.start() + " " + m.group());
        }
    }
}

结果是:

index: 0 index: 1 index: 2 56 index: 4 index: 5 index: 6

自" ab34ef"长度为6,字符串的最高指数为5 为什么索引6处有匹配?提前谢谢!

1 个答案:

答案 0 :(得分:8)

您返回了6个索引,因为此处有6个匹配,因为\d*可以匹配空字符串。在输入字符串中的每个字符之前总是有一个空字符串,因为正则表达式引擎在每个位置处理文本以查找边界或特定字符。

以下是visualization

enter image description here

这里,引擎检查字符串的开头,并说:“我看不到数字,但我可以返回匹配,因为数字位数可以是0”。它返回空字符串作为匹配项,然后继续b。依此类推,直到字符串结束。

如果您需要查找所有数字,只需使用+量词与\d速记类。

请参阅IDEONE demo