正则表达式量词加号和星号之间的区别
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+ 表示一次或多次
【讨论】:
以上是关于正则表达式量词加号和星号之间的区别的主要内容,如果未能解决你的问题,请参考以下文章