太贪心正则表达式的问题

时间:2010-11-11 13:01:58

标签: c# regex regex-greedy

我需要解析下面示例中的字符串:

Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9].*) [A-Z]");
var match = TitleRegex.Match("Chapter - 1 The Brown Fox");
Console.WriteLine(match.Groups[1].Value);

我想要的是提取一个数字。问题是输出是1 The Brown而不是简单的1 我不明白为什么字母也包含在数字([0-9])模式中。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9]{1,2}) [A-Z]");

您正在捕获.,其中匹配除新行之外的所有内容。我把{1,2}量词放在那里,这意味着它将匹配0-99。根据您的要求进行更改(或者您可以将其保留为 0或更多 *)。

您是否也可以使用\d代替[0-9]。速记通常是一件好事:)

答案 1 :(得分:2)

包含这些字母是因为您在将.*添加到捕获组时要求提供这些字母。试试([0-9]+)或更好(\d+)

答案 2 :(得分:1)

答案是你似乎在滥用量词;

[0-9].*

该部分模式匹配任何单个数字(0-9)一次,然后任何字符(。)0次或更多次(*)

删除星号前的点。

[0-9]*

答案 3 :(得分:0)

更改为:

"[A-Z].* - ([0-9]?) [A-Z]"

当您使用[0-9].*时,它会搜索一个数字加上0或多个符号,使用[0-9]+会在该特定位置为您提供一个或多个整数。如果您确定不会超过3个整数,那么您可以使用[0-9]{1,3}或尽可能多地使用4,5等等。