我有一个包含服务器文件路径($ \ 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 );
但是如何处理特殊字符($,\,/,:)以便它不被解释为正则表达式特殊字符?
答案 0 :(得分:5)
您可以使用Regex.Escape:
var regex = new Regex(Regex.Escape(sPath), RegexOptions.IgnoreCase);
var newFPath = regex.Replace(fPath, lPath);
答案 1 :(得分:3)
答案 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));