使用正则表达式的双位数和单个数字

时间:2009-06-09 00:23:30

标签: c# regex

我目前有正则表达式:

(?:(?:CD)|(?:DISC)|(?:DISK)|(?:PART))([0-9]+)

目前这将匹配CD1,DISK2等

我也需要它能够拿起CD02(两位数)以及CD2,但我似乎只能做一个或另一个,而且我的正则表达式技能很没用。

我在C#中使用此代码

感谢您的帮助

罗素

4 个答案:

答案 0 :(得分:2)

它适用于此。你能发布失败的代码吗?

请注意,您的Regex可以简化:

bool isMatch = Regex.IsMatch("CD02", "(?:(?:CD)|(?:DISC)|(?:DISK)|(?:PART))([0-9]+)");
bool isSimplifiedMatch = Regex.IsMatch("CD02", "(?:(CD|DIS[CK]|PART))([0-9]+)");

答案 1 :(得分:0)

这似乎对我有用。实际上,我在Regex Hero(.NET)和The Regex Coach(Perl)中对它进行了测试,它们都有效。它将匹配CD2和CD02。

也许您的C#代码存在问题?

答案 2 :(得分:0)

匹配CD02,因为那里有"[0-9]+"部分,表示任意数字中的一个或多个。

如果你有像"[1-9][0-9]*"这样的东西,它只会匹配CD2而不是CD02。

答案 3 :(得分:0)

您是否正在寻找捕获组中的整个字符串“CD2”或“CD02”?如:

string input = "CD02";
var labelMatch = Regex.Match(input, "(?:(?:CD|... // edit for brevity
if(labelMatch.Success)
{
   string labelText = mediaLabel.Groups[1].Value;
}

您可能使用?:表达式时出错,因为这会告诉正则表达式引擎匹配该组,然后将其从捕获组中丢弃。您可能需要考虑的其他一些表达方式:

(?:CD|DISC|DISK|PART)(\d\d?)    // throws away the label, captures 1 or 2 digits
(?:CD|DISC|DISK|PART)(\d{1,2})  // ~same thing, matches exactly 1 or 2 digits
((CD|DISC|DISK|PART)\d\d?)      // captures the whole thing in group 1