使用& # 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"。
所以我的问题是-为什么使用*
返回什么,如果直接下面的字符是不是数字?每次都会发生这种情况吗?
当您得到子字符串时,您将得到def123
。
-
'd+
尝试在字符串中至少获得一个匹配,并将贪婪地匹配更多。它必须遍历字符串以找到第一个匹配项,到达123。 - 另一方面,
'd*
将从字符串的开头开始,并成功地匹配字符串的开头与零数字。尽管它是贪婪的,但它完全满足于匹配零位数。成功匹配,宽度为零。
您可以通过使'd*$
锚定在匹配字符串的末尾来改变此行为。
我想你自己回答了你的问题。此行为是默认的,并且每次都会发生。
参见量词小抄
A+
一个或多个A ,尽可能多(贪婪),如果引擎需要回溯(温顺)放弃字符A*
0个或多个A ,尽可能多(贪婪),如果引擎需要回溯(温顺)放弃字符
由于'd*
可以匹配一个空字符串,它将匹配一个空字符串,因为regex引擎总是尝试返回一个有效的匹配,甚至可以在字符串的开头,结尾和字符之间匹配空子字符串