C# 如果源字符串不是以相同的子字符串开头,则在子字符串前加前缀

C# 如果源字符串不是以相同的子字符串开头,则在子字符串前加前缀,c#,.net,regex,vb.net,replace,C#,.net,Regex,Vb.net,Replace,我正在尝试创建一个有效的正则表达式替换模式,以正确格式化特定的.XML文件名。具体地说,如果文件名不是以前缀开头,比如说,ACE。如果XML文件名和扩展名不是以ACE\开头,请在文件名前加上字符串ACE\。例如,如果我的输入源字符串如下所示: ^ACE_{1}[\d\D]+ Widgets.xml 我希望执行单个正则表达式替换,该替换将导致字符串为: ACE_Widgets.xml 相反,如果字符串已经以ACE_开头,我希望它保持不变 另外,如何在RegEx替换模式的相同匹配模式中包含模式“.

我正在尝试创建一个有效的正则表达式替换模式,以正确格式化特定的.XML文件名。具体地说,如果文件名不是以前缀开头,比如说,ACE。如果XML文件名和扩展名不是以ACE\开头,请在文件名前加上字符串ACE\。例如,如果我的输入源字符串如下所示:

^ACE_{1}[\d\D]+
Widgets.xml

我希望执行单个正则表达式替换,该替换将导致字符串为:

ACE_Widgets.xml

相反,如果字符串已经以ACE_开头,我希望它保持不变

另外,如何在RegEx替换模式的相同匹配模式中包含模式“.xml”,以确保文件名和扩展名的字符串模式以“.xml”结尾

至于这场比赛,我有以下几点运气:

^ACE_{1}[\d\D]+
如果输入字符串为ACE_Widgets.xml,则表示模式匹配,如果字符串为Widgets.xml,则表示不匹配

RegEx模式就足够了,但是如果您需要知道我想要使用的语言,那么替换模式是C#或VB.NET中的.NET4.0

下面的帖子与我想要的内容非常接近,但是由于包含了*ix目录路径前缀,并且在PHP中使用了preg_replace(),我在如何让它与我需要做的工作配合起来方面有点困难:


一如既往,提前感谢您的时间、帮助和耐心。非常感谢他们…

如果RegExp不是一个特定的需求,我建议您使用函数,因为它读起来更自然

var filename = "Widget.xml";
if(!filename.StartsWith("ACE_"))
{
    File.Move(filename, Path.Combine(Path.GetDirectoryName(filename), string.Format("ACE_{0}", Path.GetFileName(filename)))); 
}

此处不需要正则表达式:

var fileName = …;
var prefix = "ACE_"
if (!fileName.StartsWith(prefix))
    fileName = prefix + fileName;
如果要添加对.xml扩展名的检查,请添加:

var extension = ".xml";
if (!fileName.EndsWith(extension))
    fileName = fileName + extension;

实际上,regex是一种非常干净的方法来实现这一点。以下是一个解决方案,其中正则表达式以自由间距模式编写,带有lots-o注释:

text=Regex.Replace(text,@”
#匹配不以:ACE开头的XML文件名_
^#锚定至管柱起点。
(?!ACE#断言不以ACE开头_
.*#将文件名与扩展名匹配。
(?i)#使.xml不区分大小写
\.xml#需要xml文件扩展名。
$#锚定到字符串的末尾。“,
“ACE_u$0”,RegexOptions.ignorepattern空白);
请注意,这假设
ACE\uu
前缀要求是区分大小写的。

现在在c#6中


您是否有任何具体原因要使用RegExp来完成此操作,而不是简单的
filename.StartsWith(“ACE\u”)
?您对C#或VB.Net?Yas4891:感谢您的反馈;我代表我们办公室的一位同事提出了我的问题。我也建议他也使用String.StartsWith(),但根据他当前的代码基础,他需要使用RegEx.Replace()更新文件名String。再次感谢你的建议……嗨,斯维克;谢谢你的建议。使用String.StartsWith()与yas4891 Suggested的思路相同,正如我提到的,我也建议我的同事使用String.StartsWith();但他当前的代码库需要使用RegEx.Replace()。正如我在另一条评论中所说:这种限制没有任何意义。如果你的代码中真的有,那就修改代码。非常非常感谢,ridgerunner。关于替换模式的解释帮助很大,代码片段也很到位。我能够轻松地与我的同事一起实现它。我再次感谢大家的投入。有些人可能真的不同意我的观点,但我永远不会通过一个正则表达式的代码审查,而这个正则表达式无法在基础语言中以更可读、更易于扩展的方式完成,例如StartsWithI total agree@user1043000。在我看来,Regex从来都不是一种干净的做事方式。可能性能良好,可能较短,但不干净或不清晰。