0

私はC#で次のものを持っています。

string fileName = @"X:\Users\username\AppData\Local\foo.txt";

次の結果が得られるように実行したいと思いRegex.Replaceます。

string fileName = @"X:\Users\AppData\Local\foo.txt";

X:ドライブ文字 ( ) を動的にできる正規表現を使用すると便利です。要するに、「username」の部分を削除するだけです。また、ユーザー名はユーザーの実際の名前のプレースホルダーにすぎないことに注意してください。つまり、ボブ、ラリー、ジョン、またはその他の名前になる可能性があります。正規表現はこれを考慮する必要があります。

ここでX:\Users\期待できることは、常に (X: はC:orD:など) で始まり、その後に何らかの文字列が続き、その後に a が続き、その後にそうで\ない他のパス要素が続くということです。重要。また、大文字と小文字を区別しないで一致させるとよいでしょうusers or Users

これは がなくても実行できることはわかっていますが、サポートRegexのみを提供する大規模なシステムに適合させるためにこれが必要です。やRegexのようなものはサポートされていません。String.ReplaceString.Join

4

1 に答える 1

0

このサンプルを試すことができます:

string fileName = @"X:\Users\username\AppData\Local\foo.txt";
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:*\\Users\\)(\w+\\)(.*)", "$1$3"));

説明:

  1. ([A-Z]{1}\:\\[Uu]sers\\)-正規表現のこの部分はusername、パス内の、の前の最初の文字グループです。
    • ^行の先頭を表します(ファイル名の前の単語を無視するには、これを削除してください)
    • [A-Z]{1}\:\\ディスクルートパスを表します。次のように、ここに表示するディスク文字を選択できます[CDX-Z]{1}。注{1}-これは制約であり、大文字が1つだけ必要であることを意味します。
    • [Uu]sers\\ユーザーディレクトリ名を表します。大文字と小文字を区別しないユーザーパスのグループに注意してください。これは最初のグループ$1であり、置換パターンで 参照されます。
  2. (\w+\\)-正規表現のこの部分はusername、パス内の 2番目の文字グループである。
    • \w+\\少なくとも1つの単語の文字と\記号を表します。これは2番目のグループであり、置換パターンではありません
  3. (.*)-正規表現のこの部分はusername、パス内の、の後の3番目の文字グループです。
    • .*\削除された記号の後の任意の文字を表します。

更新:現実の世界では、スペース、Unicode文字、および〜を含むユーザー名が見つかりました。そこで、2。グループを置き換えて、\記号以外の文字を含めました。

string fileName = @"X:\Users\username\AppData\Local\foo.txt";
Console.Write(Regex.Replace(fileName, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "$1$3"));
于 2012-12-20T12:01:00.470 に答える