gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:15:22 25 4
gpt4 key购买 nike

我想编写一个正则表达式,它会递归地去除某些文件扩展名(不是全部)。要删除的扩展名是.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 和/或 .error。我知道我可以用代码来做到这一点,但我很想知道如何用正则表达式来解决这个问题,因为我觉得这是可能的。

最佳答案

这似乎太简单了,所以一定是哪里出了问题,但我还是要发布我的解决方案。
您只需将第一组 (.+) 中的 + 替换为非贪婪版本 +?。最终的正则表达式变成了这个:^(.+?)(?:\.(?: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);

关于c# - .NET:如何在与正则表达式匹配时排除某些文件扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17996066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com