正则表达式量词加号和星号之间的区别

Posted

技术标签:

【中文标题】正则表达式量词加号和星号之间的区别【英文标题】:Difference between regex quantifiers plus and star 【发布时间】:2014-06-30 14:29:07 【问题描述】:

我尝试从 "Wrong parameters - Error 1356" 之类的字符串中提取错误号:

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

这不会打印任何东西,这对我来说变得很奇怪,因为 * 意味着 * - Matches the preceding element zero or more times 来自 Wiki

我也去www.regexr.com和regex101.com测试了一下,结果是一样的,这个表达式没有\d*

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

(\d)* 不起作用 \d0, 不起作用 [\d]* 不起作用 [0-9]* 不起作用 \d4 工作 \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: possessive quantifier for the star repetition operator, i.e. \d**,但这里没有解释差异。

【问题讨论】:

Reference - What does this regex mean?的可能重复 我会清除你的困惑:\d* 将匹配空字符串。尝试添加 g 修饰符以匹配所有。它也应该与数字匹配。 demo edit:确实匹配空字符串。 @HamZa 我也看到了这个答案,我不认为它是重复的,因为它与我在网上找到的参考文献相同,并且无法为我的问题得到正确的解释。弗兰克施密特提供的答案只是用这句话澄清了一切:matches at the start of the input。那是我没有考虑的事情。 有点离题:回到你的问题,它的 java 特定 -> m.group(1) 与模式 "(...)" 中的组一起工作,这就是为什么你不能在那里继续: D 它还需要依赖于 m.matches() 的 m.group() 并且只需要获取数字或失败 =) 使用 m.find() 然后从 m.start() 获取您的输入m.end() 但请记住,索引将为 x-1,其中 x 是 m.start/m.end 将返回的值 【参考方案1】:

* 量词匹配零次或多次次。

实际上,这意味着

\d*

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

【讨论】:

这是我没有看到的问题:matches at the start of the input 谢谢。【参考方案2】:

but none if necessary 表示如果没有匹配,它不会破坏正则表达式模式。所以\d* 意味着它将匹配zero or more occurrences 的数字。

例如。

\d*[a-z]*

将匹配

abcdef

但是\d+[a-z]*

不匹配

abcdef

因为\d+ 暗示至少需要一位数字。

【讨论】:

【参考方案3】:
\d* Eat as many digits as possible (but none if necessary)

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

\d+

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

简单地说:

\d* 表示零次或多次

\d+ 表示一次或多次

【讨论】:

以上是关于正则表达式量词加号和星号之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式加与星号的区别? [复制]

具有不同量词的正则表达式捕获组

正则表达式

PERL正则表达式笔记——概述

这两个正则表达式有啥区别? (理解?量词)

正则表达式量词 - 两个字符之间的数量