如果源字符串不以相同的子字符串开头,则前置子字符串

时间:2011-10-10 15:07:13

标签: c# .net regex vb.net replace

我正在尝试创建有效的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?

与往常一样,提前感谢您的时间,帮助和耐心。非常感谢他们......

4 个答案:

答案 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}";