Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET:在与正则表达式匹配时,如何排除某些文件扩展名?_C#_.net_Regex - Fatal编程技术网

C# .NET:在与正则表达式匹配时,如何排除某些文件扩展名?

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

我想写一个正则表达式,它可以递归地去除某些文件扩展名(不是全部)。要剥离的扩展名是.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.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解决这个问题,因为我觉得这是可能的。这正是我想要的。我知道我需要非贪婪匹配,只是不知道如何指定它。谢谢。