String.Replace方法忽略具有特殊字符的大小写。

时间:2012-11-27 14:08:43

标签: c# regex string replace

我有一个包含服务器文件路径($ \ MyPath \ Quotas \ ExactPath \ MyFile.txt)和本地文件系统路径(C:\ MyLocalPath \ Quotas \ ExactPath)的字符串。我想用本地系统路径替换服务器文件路径。

我目前有一个确切的替代品:

String fPath = @"$\MyPath\Quotas\ExactPath\MyFile.txt";
String sPath = @"$\MyPath\Quotas\ExactPath\";
String lPath = @"C:\MyLocalPath\Quotas\ExactPath\";

String newPath = fPath.Replace(sPath, lPath);

但我希望这是一个不区分大小写的替换,因此它也会用lPath替换$ \ MyPath \ quotas \ Exactpath \。

我遇到了正则表达式的使用,如下所示:

var regex = new Regex( sPath, RegexOptions.IgnoreCase );
var newFPath = regex.Replace( fPath, lPath );

但是如何处理特殊字符($,\,/,:)以便它不被解释为正则表达式特殊字符?

4 个答案:

答案 0 :(得分:5)

您可以使用Regex.Escape

var regex = new Regex(Regex.Escape(sPath), RegexOptions.IgnoreCase);
var newFPath = regex.Replace(fPath, lPath);

答案 1 :(得分:3)

只需使用Regex.Escape

fPath = Regex.Escape(fPath);

这会逃脱所有元字符并将其转换为文字。

答案 2 :(得分:0)

由于您只是在案例感觉设置之后,而不是任何正则表达式匹配,因此您应该使用String.Replace而不是Regex.Replace。令人惊讶的是,Replace方法没有超载任何文化或比较设置,但可以通过扩展方法修复:

public static class StringExtensions {

  public static string Replace(this string str, string match, string replacement, StringComparison comparison) {
    int index = 0, newIndex;
    StringBuilder result = new StringBuilder();
    while ((newIndex = str.IndexOf(match, index, comparison)) != -1) {
      result.Append(str.Substring(index, newIndex - index)).Append(replacement);
      index = newIndex + match.Length;
    }
    return index > 0 ? result.Append(str.Substring(index)).ToString() : str;
  }

}

用法:

String newPath = fPath.Replace(sPath, lPath, StringComparison.OrdinalIgnoreCase);

测试性能,显示比使用Regex.Replace快10-15倍。

答案 3 :(得分:0)

我建议不要使用Replace。使用System.IO中的路径类:

string fPath = @"$\MyPath\Quotas\ExactPath\MyFile.txt";
string lPath = @"C:\MyLocalPath\Quotas\ExactPath\";

string newPath = Path.Combine(lPath, Path.GetFileName(fPath));