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

本文关键字:正则表达式 检查 使用 | 更新日期: 2023-09-27 18:14:36

我有一个正则表达式检查:

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

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

,

如果我使用@"'d+"代替,它将查找1个或多个数字,并返回数字的第一个实例,无论子字符串之后的位置如何。

如果我有一个字符串("abcdef123")和一个子字符串("abc"):

  • @"'d*"将匹配null
  • @"'d+"将匹配"123"

或者,如果子字符串为"abcdef",则两者都将匹配"123"。

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

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

当您得到子字符串时,您将得到def123

  • 'd+尝试在字符串中至少获得一个匹配,并将贪婪地匹配更多。它必须遍历字符串以找到第一个匹配项,到达123。
  • 另一方面,'d*将从字符串的开头开始,并成功地匹配字符串的开头与数字。尽管它是贪婪的,但它完全满足于匹配零位数。成功匹配,宽度为零。

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

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

参见量词小抄

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

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

由于'd*可以匹配一个空字符串,它将匹配一个空字符串,因为regex引擎总是尝试返回一个有效的匹配,甚至可以在字符串的开头,结尾和字符之间匹配空子字符串