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

代码如下:

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处有匹配? 先感谢您!

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

这是可视化 :

在此处输入图像描述

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

如果您需要查找所有数字,只需使用带有\d简写类的+量词。

请参阅IDEONE演示