我目前有正则表达式:
(?:(?:CD)|(?:DISC)|(?:DISK)|(?:PART))([0-9]+)
目前这将匹配CD1,DISK2等
我也需要它能够拿起CD02(两位数)以及CD2,但我似乎只能做一个或另一个,而且我的正则表达式技能很没用。
我在C#中使用此代码
感谢您的帮助
罗素
答案 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