为什么正则表达式返回一位数?

时间:2014-12-23 08:07:44

标签: c# regex

我想从字符串中获取最后一位数字。

例如:" Text11" - 11; " Te1xt32" - 32等等。

我写这个正则表达式:

var regex = new Regex(@"^(.+)(?<Number>(\d+))(\z)");

并使用它:

 regex.Match(input).Groups["Number"].Value;

为&#34; Text11&#34;返回12 for&#34; Te1xt32&#34;而是1132

那么问题,为什么\d+只获得最后一位数?

3 个答案:

答案 0 :(得分:2)

因为默认情况下第一个.+是贪婪的,所以.+贪婪地匹配到最后一个然后它回溯到前一个字符并使用模式\d+来产生匹配。您需要在?旁边添加一个非贪婪的量词+,以使正则表达式引擎执行非贪婪匹配或最短匹配。

var regex = new Regex(@"^(.+?)(?<Number>(\d+))(\z)");

DEMO

答案 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);

Demo on ideone

由于您想要找到的是在字符串的末尾并且前面的部分没有任何模式,因此在这种情况下从右到左避免了一些回溯,尽管差异(如果有的话)是在这种情况下会变得微不足道。

RightToLeft模式,顾名思义,从右到左执行匹配,因此\d+贪婪地消耗字符串末尾的数字,然后.+消耗其余数字{{1}} 1}}。

答案 2 :(得分:1)

您可以这样做:

var regex = new Regex(@"(?<Number>\d+)\z");