在正则表达式检查中使用'*'而不是'+'

时间:2015-09-24 22:31:12

标签: c# regex

我有正则表达式检查:

Match matchLeft = Regex.Match(Name.Substring(subName.Length), @"\d*");

这基本上检查subName末尾的第一个数字。现在,我注意到在正则表达式中使用** = 0或更多),如果下一个字符不是数字,它将不返回任何内容。但是,如果它们是,它将返回数字字符串。

但是

如果我改为使用@"\d+",它会查找 1个或更多个数字,并返回第一个数字实例,无论子字符串后面的位置如何。

所以如果我有一个字符串(“abcdef123”)和一个子字符串(“abc”):

  • @"\d*"将匹配null
  • @"\d+"将匹配“123”

或者,如果子串是“abcdef”,则两者都匹配“123”。

所以我的问题是 - 如果直接跟随的字符不是数字,为什么使用*什么都不返回?这会发生每次吗?

2 个答案:

答案 0 :(得分:1)

当您获得子字符串时,最终会得到def123。以下是真实的:

  • \d+尝试在字符串中至少获得一个匹配项,并且会贪婪地匹配更多匹配项。它必须遍历字符串才能找到第一个匹配,到达123.
  • 另一方面,\d*将从字符串的开头开始,并将成功地将字符串的开头与数字匹配。即使它是贪婪的,它也完全满足于匹配零位数。 这是一个成功的匹配,是零宽度。

您可以通过将\d*$锚定在匹配字符串的末尾来更改此行为。

答案 1 :(得分:0)

我想你自己回答了你的问题。此行为是默认行为,每次都会发生。

请参阅Quantifier Cheat Sheet

  

A +
一个或多个As ,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符

     

A *
零或多个As ,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符

由于\d*可以匹配空字符串,因此它将匹配空字符串,因为正则表达式引擎总是尝试返回有效匹配,甚至可以匹配字符串中开头,结尾和字符之间的空子串。 / p>