C# .NET:在与正则表达式匹配时,如何排除某些文件扩展名?
我想写一个正则表达式,它可以递归地去除某些文件扩展名(不是全部)。要剥离的扩展名是.ready、.done和.error。应通过单个组项目进行匹配 例如:C# .NET:在与正则表达式匹配时,如何排除某些文件扩展名?,c#,.net,regex,C#,.net,Regex,我想写一个正则表达式,它可以递归地去除某些文件扩展名(不是全部)。要剥离的扩展名是.ready、.done和.error。应通过单个组项目进行匹配 例如: HelloWorld.xml --> HelloWorld.xml Hello@World.xml.ready --> Hello@World.xml Yaba_Daba-Doo.aaa.orig --> Yaba_Daba-Doo.aaa.orig HelloWorld.xml.r
HelloWorld.xml --> HelloWorld.xml
Hello@World.xml.ready --> Hello@World.xml
Yaba_Daba-Doo.aaa.orig --> Yaba_Daba-Doo.aaa.orig
HelloWorld.xml.ready.error --> HelloWorld.xml
yogibear.xml.ready.done --> yogibear.xml
HelloWorld.bbb.done --> HelloWorld.bbb
Merry Chrismas.ready.yyy --> Merry Chrismas.ready.yyy
因此,我提出了以下简单的正则表达式-^(+.:\(?:ready | done | error))*$
唉,它并没有像预期的那样工作,因为(.+)
似乎是一个贪婪的匹配
不幸的是,它可能是任何文件名。我唯一想要的就是修剪任何尾随的
.ready
,.done
和/或错误。我知道我可以在代码中做到这一点,但我很想知道如何用regex解决这个问题,因为我觉得这是可能的 这似乎太容易了,所以一定是出了问题,但我还是要发布我的解决方案。
您只需将第一组(.+)
中的+
替换为非贪婪版本+?
。
最后一个正则表达式变成这样:^(+.+)(?:\(?:ready | done | error))*$
您可以使用以下代码进行尝试:
string strRegex = @"^(.+?)(?:\.(?:ready|done|error))*$";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"Merry Chrismas.ready.yyy";
string strReplace = @"${1}";
return myRegex.Replace(strTargetString, strReplace);
也许这里最好的选择是首先匹配文件列表,然后去除不需要的文件扩展名,如下所示:
Regex regex = new Regex(@"\.(ready|done|error)$", RegexOptions.IgnoreCase);
fileNames = fileNames.Select(f => regex.Replace(f, "")).ToList();
我只是不明白尝试匹配字符串开头的意义。试试这个
String[] test ={ "HelloWorld.xml", "HelloWorld.xml.ready", "HelloWorld.xml.orig", "HelloWorld.xml.ready.error", "HelloWorld.xml.ready.done", "HelloWorld.bbb.done", "HelloWorld.ready.yyy" };
var query = test.ToArray().Where(c => Regex.IsMatch(c,"(?:error|done|ready)$"));
foreach (String field in query)
{
Console.WriteLine(field);
}
在您的模式中插入.xml,应该可以。类似于^(.+)\.xml(?:\(?:ready | done | error))*$
是否总是与xml文件相关?使用System.IO.Path.GetExtension()或Split不是更容易吗?
表示任何字符,+
表示一个或多个字符。所以它吸收了一个或多个字符(即整个字符串)。不过,我们需要更多关于文件名的信息来为它们生成正则表达式。如果您的文件名类似于HelloWorld
,没有下划线,只有字母,那么您可以将(.+)
替换为(\w+)
。不幸的是,它可能是任何文件名。我唯一想要的就是修剪任何尾随的.ready
,.done
和/或错误。我知道我可以在代码中做到这一点,但我很想知道如何用regex解决这个问题,因为我觉得这是可能的。这正是我想要的。我知道我需要非贪婪匹配,只是不知道如何指定它。谢谢。