试图理解这个正则表达式代码

时间:2014-09-07 23:21:01

标签: java regex

我有以下代码。据我所知,程序应该打印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 *,

  1. 它在位置0处找到一个命中,但由于命中不是一个数字,它只打印0
  2. 它在位置1找到一个匹配,但是再次,不是数字,打印0
  3. 在第2位找到一个命中,因为我们正在寻找\ d *,命中是34,所以打印234。
  4. 移动到位置4,找到一个点击,但由于点击不是数字,它只打印4。
  5. 移动到位置5,找到一个点击,但由于点击不是数字,它只打印5。
  6. 此时,据我所知,应该这样做。但由于某种原因,该程序也返回6.

    如果有人可以解释,我会非常感激。

1 个答案:

答案 0 :(得分:2)

\ d *匹配零(!)或更多数字,这就是为什么它返回一个空字符串作为0和1匹配的原因,它匹配位置2处的34和位置4和5处的空字符串。剩下要匹配的是一个空字符串。并且这个空字符串也匹配\ d *(因为空字符串包含零位数),这就是为什么在位置6处有另一个匹配的原因。

为了对比这个尝试使用\ d +(匹配一个或多个数字)作为模式,然后看看会发生什么。