1

我有一个看起来像的正则表达式\D*(\d*).*。它的目的是获取它可以找到的第一个数字并将其存储在第一个捕获组中。但是,当我给它输入一个字符串时testing123,它不匹配它!这让我困惑了一段时间;为什么不匹配?

Java代码:

String s = "testing123"
Pattern p = Pattern.compile("\\D*(\\d*).*");
Matcher m = p.matcher(s);
//m did not match anything
4

2 回答 2

5

我认为您Matcher错误地使用了该对象:调用

if (m.find()) {
    System.out.println(m.group(1));
}

印刷123

链接到ideone)。

于 2012-11-12T01:28:00.683 回答
0

简化您的正则表达式

你的表达是:

\D*(\d*).*

这表示:

  1. 零个或多个字符(数字除外)...
  2. 后跟零个或多个数字...
  3. 后跟零个或多个字符。

除了任何语法问题外,这似乎是一个不必要的复杂化。要匹配一行上的数字,为什么不直接捕获数字呢?例如:

\d+

或者,如果您想确保在单词边界的末尾只有数字,例如:

\d+\b

与任何 PCRE 兼容的引擎都可以正常工作。在 Java 中,这始终将“123”放入group(0)而不需要捕获子表达式。

于 2012-11-12T01:36:55.140 回答