【问题标题】:Trying to understand this Regex code [duplicate]试图理解这个正则表达式代码[重复]
【发布时间】:2014-09-07 23:21:01
【问题描述】:

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

如果有人能解释一下,不胜感激。

【问题讨论】:

  • 将打印改为:System.out.println("pos: "+m.start() + "; match:" + m.group());,你就会明白发生了什么
  • 空模式(对于非数字位置有效)匹配“之前”和“之后”字符,因此它也匹配字符串的末尾。

标签: java regex


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多