1

我有一个包含服务器文件路径 ($\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

4 回答 4

5

您可以使用Regex.Escape

var regex = new Regex(Regex.Escape(sPath), RegexOptions.IgnoreCase);
var newFPath = regex.Replace(fPath, lPath);
于 2012-11-27T14:11:38.313 回答
3

只需使用Regex.Escape

fPath = Regex.Escape(fPath);

这会转义所有元字符并将它们转换为文字。

于 2012-11-27T14:11:40.780 回答
0

由于您只是在 case sensetivity 设置之后,而不是任何正则表达式匹配,因此您应该使用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.

于 2012-11-27T14:30:50.587 回答
0

我建议根本不要使用替换。使用 System.IO 中的Path类:

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

string newPath = Path.Combine(lPath, Path.GetFileName(fPath));
于 2012-11-27T17:19:41.067 回答