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);

しかし、これを大文字と小文字を区別しない置換にして、 $\MyPath\quotas\Exactpath\ も lPath に置き換えるようにしたいと考えています。

次のような正規表現の使用に出くわしました。

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

大文字と小文字の区別を設定した後であり、正規表現の一致はないため、ではなくを使用する必要があり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);

パフォーマンスをテストすると、これはを使用するよりも10〜15倍高速であることがわかりますRegex.Replace

于 2012-11-27T14:30:50.587 に答える
0

Replace をまったく使用しないことをお勧めします。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 に答える