我想从字符串中获取最后一位数字。
例如:" Text11" - 11
; " Te1xt32" - 32
等等。
我写这个正则表达式:
var regex = new Regex(@"^(.+)(?<Number>(\d+))(\z)");
并使用它:
regex.Match(input).Groups["Number"].Value;
为&#34; Text11&#34;返回1
和2
for&#34; Te1xt32&#34;而是11
和32
。
那么问题,为什么\d+
只获得最后一位数?
答案 0 :(得分:2)
因为默认情况下第一个.+
是贪婪的,所以.+
贪婪地匹配到最后一个然后它回溯到前一个字符并使用模式\d+
来产生匹配。您需要在?
旁边添加一个非贪婪的量词+
,以使正则表达式引擎执行非贪婪匹配或最短匹配。
var regex = new Regex(@"^(.+?)(?<Number>(\d+))(\z)");
答案 1 :(得分:1)
作为替代方案,您可以在RightToLeft
模式下使用相同的正则表达式:
var input = "Te1xt32";
// I removed some unnecessary capturing groups in your regex
var regex = new Regex(@"^(.+)(?<Number>\d+)\z", RegexOptions.RightToLeft);
// You need to specify the starting index as the end of the string
Match m = regex.Match(input, input.Length);
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine(m.Groups["Number"].Value);
由于您想要找到的是在字符串的末尾并且前面的部分没有任何模式,因此在这种情况下从右到左避免了一些回溯,尽管差异(如果有的话)是在这种情况下会变得微不足道。
RightToLeft
模式,顾名思义,从右到左执行匹配,因此\d+
贪婪地消耗字符串末尾的数字,然后.+
消耗其余数字{{1}} 1}}。
答案 2 :(得分:1)
您可以这样做:
var regex = new Regex(@"(?<Number>\d+)\z");