我有正则表达式检查:
Match matchLeft = Regex.Match(Name.Substring(subName.Length), @"\d*");
这基本上检查subName
末尾的第一个数字。现在,我注意到在正则表达式中使用*
(*
= 0或更多),如果下一个字符不是数字,它将不返回任何内容。但是,如果它们是,它将返回数字字符串。
但是
如果我改为使用@"\d+"
,它会查找 1个或更多个数字,并返回第一个数字实例,无论子字符串后面的位置如何。
所以如果我有一个字符串(“abcdef123”)和一个子字符串(“abc”):
@"\d*"
将匹配null
@"\d+"
将匹配“123”或者,如果子串是“abcdef”,则两者都匹配“123”。
所以我的问题是 - 如果直接跟随的字符不是数字,为什么使用*
什么都不返回?这会发生每次吗?
答案 0 :(得分:1)
当您获得子字符串时,最终会得到def123
。以下是真实的:
\d+
尝试在字符串中至少获得一个匹配项,并且会贪婪地匹配更多匹配项。它必须遍历字符串才能找到第一个匹配,到达123. \d*
将从字符串的开头开始,并将成功地将字符串的开头与零数字匹配。即使它是贪婪的,它也完全满足于匹配零位数。 这是一个成功的匹配,是零宽度。 您可以通过将\d*$
锚定在匹配字符串的末尾来更改此行为。
答案 1 :(得分:0)
我想你自己回答了你的问题。此行为是默认行为,每次都会发生。
A +
一个或多个As ,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符A *
零或多个As ,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符
由于\d*
可以匹配空字符串,因此它将匹配空字符串,因为正则表达式引擎总是尝试返回有效匹配,甚至可以匹配字符串中开头,结尾和字符之间的空子串。 / p>