我尝试从像"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.com和regex101.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**但是这里没有解释它的区别。
答案 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 +表示一次或多次