我正在尝试创建有效的RegEx替换模式,以正确格式化特定的.XML文件名。具体来说,如果文件名不以前缀开头,那么就说ACE_。如果XML文件名和扩展名不以ACE_开头,则将字符串ACE_添加到文件名中。例如,如果我的输入源字符串如下:
Widgets.xml
我想执行一个RegEx Replacement,导致字符串为:
ACE_Widgets.xml。
相反,如果字符串已经以ACE_开头,我希望它保持不变。
另外,如何包含模式“.xml”以确保文件名和扩展名的字符串模式以“.xml”结尾,并且RegEx替换模式的匹配模式相同?
至于比赛,我对以下内容感到满意:
^ACE_{1}[\d\D]+
如果输入字符串是ACE_Widgets.xml则表示模式匹配,如果字符串是Widgets.xml则不匹配
RegEx模式就足够了,但是如果您需要知道我想要使用的语言,那么替换模式是在.NET 4.0中的C#或VB.NET中。
以下帖子接近我正在寻找的内容,但是包含了* ix目录路径前缀,并且在PHP中使用了preg_replace(),我有点难以接受它与我需要做的事情一起工作:
Regular Expression: How to replace a string that does NOT start with something?
与往常一样,提前感谢您的时间,帮助和耐心。非常感谢他们......
答案 0 :(得分:6)
实际上,正则表达式是一种非常干净的方法来实现这一目标。这是一个带有正则表达式的解决方案,它以自由间隔模式编写,带有很多注释:
text = Regex.Replace(text, @"
# Match XML file names not starting with: ACE_
^ # Anchor to start of string.
(?!ACE_) # Assert does not start with ACE_
.* # Match filename up to extension.
(?i) # Make case insensitive for .xml
\.xml # Require XML file extension.
$ # Anchor to end of string.",
"ACE_$0", RegexOptions.IgnorePatternWhitespace);
请注意,这假定ACE_
前缀要求区分大小写。
答案 1 :(得分:3)
如果RegExp不是特定要求,我建议您使用String.StartsWith()函数,因为它更自然地读取。
var filename = "Widget.xml";
if(!filename.StartsWith("ACE_"))
{
File.Move(filename, Path.Combine(Path.GetDirectoryName(filename), string.Format("ACE_{0}", Path.GetFileName(filename))));
}
答案 2 :(得分:3)
这里不需要正则表达式:
var fileName = …;
var prefix = "ACE_"
if (!fileName.StartsWith(prefix))
fileName = prefix + fileName;
如果您还想添加.xml扩展名的检查,请添加:
var extension = ".xml";
if (!fileName.EndsWith(extension))
fileName = fileName + extension;
答案 3 :(得分:1)
这些日子在c#6
var fileName = "Widgets.xml"; // or "ACE_Widgets.xml"
var prefix = "ACE_"
fileName = fileName.StartsWith(prefix) ? fileName : $"{prefix}{fileName}";