正则表达式加上和星之间的区别

时间:2014-06-30 14:29:07

标签: regex

我尝试从像"Wrong parameters - Error 1356"这样的字符串中提取错误编号:

 Pattern p = Pattern.compile("(\\d*)");
 Matcher m = p.matcher(myString);
 m.find();
 System.out.println(m.group(1));

这不会打印任何内容,这对我来说很奇怪,*表示来自Wiki* - Matches the preceding element zero or more times

我也去了www.regexr.comregex101.com并对其进行了测试,结果是一样的,这个表达式没有任何内容\d*

然后我开始测试一些不同的东西(在我提到的网站上进行的所有测试):

  • (\d)*无法正常工作
  • \d{0,}无法正常工作
  • [\d]*无法正常工作
  • [0-9]*无法正常工作
  • \d{4}正常工作
  • \d+正常工作
  • (\d+)正常工作
  • [0-9]+正常工作

所以,如果能找到解释,我会开始在网上搜索。我能找到的最好的是量词部分here,其中指出:

\d? Optional digit (one or none).
\d* Eat as many digits as possible (but none if necessary)
\d+ Eat as many digits as possible, but at least one.
\d*? Eat as few digits as necessary (possibly none) to return a match.
\d+? Eat as few digits as necessary (but at least one) to return a match.

问题

由于英语不是我的主要语言,我很难理解差异(主要是(but none if necessary)部分)。那么Regex专家们能用简单的话解释一下吗?

我在这个问题上最接近这个问题的是这个:Regex: possessive quantifier for the star repetition operator, i.e. \d**但是这里没有解释它的区别。

5 个答案:

答案 0 :(得分:5)

*量词匹配零或更多出现。

实际上,这意味着

\d*

将匹配每个可能的输入,包括空字符串。所以你的正则表达式在输入字符串的开头匹配并返回空字符串。

答案 1 :(得分:2)

but none if necessary表示如果没有匹配则不会破坏正则表达式模式。因此\d*表示它将匹配zero or more occurrences个数字。

例如。

\d*[a-z]*

将匹配

abcdef

但是\d+[a-z]*

不匹配

abcdef

因为\d+意味着至少需要一个数字。

答案 2 :(得分:0)

\d* Eat as many digits as possible (but none if necessary)

\d*表示匹配数字零次或多次。在您的输入中,它匹配最少的一个(即数字的零次)。所以它没有打印。

\d+

匹配数字一次或多次。所以它应该找到并匹配一个数字或一个数字后跟更多的数字。

答案 3 :(得分:0)

使用模式/ d +至少需要一个数字,然后匹配将返回所有后续字符,直到达到非数字字符。

/ d *将匹配所有空字符串(零或更多)以及匹配。 .Net Regex解析器将在其匹配集中返回所有这些空字符串组。

答案 4 :(得分:0)

简单地:

\ d *表示零次或多次

\ d +表示一次或多次