3

なぜこれは何もしないのですか、出力は入力と同じですか?困惑しました!!!

string name = ";;;'']][[ zion \\\[[[]]]"  
char[] invalidChars = System.IO.Path.GetInvalidPathChars();
string invalidString = Regex.Escape(new string(invalidChars));

string valid = Regex.Replace(name, "[" + invalidString + "]", "");
4

3 に答える 3

6

編集:

それは不完全なテストデータの場合かもしれないと思います(他の人が提案した機能の変更と一緒に)。これを試して:

string name = "tru\\e.jpg";
char[] invalidChars = System.IO.Path.GetInvalidFileNameChars();
string invalidString = Regex.Escape(new string(invalidChars));
string valid = Regex.Replace(name, "[" + invalidString + "]", "");
Console.WriteLine(valid);

「true.jpg」の出力が得られます。これを本番環境で使用する前に、さらに多くのテストを行うことをお勧めします。:)

于 2009-09-10T02:33:58.530 に答える
4

を使用して無効なファイル文字を取得します。

char[] invalidChars=System.IO.Path.GetInvalidFileNameChars();
于 2009-09-10T02:31:50.733 に答える
4

何もしないとはどういう意味ですか?コンソールアプリケーションで次のコマンドを実行しました。

string name = ";;;'']][[ zion \\\\[[[]]]";
char[] invalidChars = System.IO.Path.GetInvalidPathChars();
string invalidString = Regex.Escape(new string(invalidChars));

string valid = Regex.Replace(name, "[" + invalidString + "]", "");
Console.WriteLine(valid);

ちなみに、構文が間違っていたため、エスケープされていない文字がいくつかあり、セミコロンがありませんでした。

そして、次のような結果が得られました。

;;;'']][[ zion \\[[[]]]

これは正しい結果です。現在のアプローチは、正規表現を十分に理解していないことを示しているように思われるため、何をしようとしているのかについて新しい質問をする必要があるかもしれません。

更新:ファイル名を確認しようとしていますか?もしそうなら、あなたはおそらく使用したいと思うでしょう:

System.IO.Path.GetInvalidFileNameChars();

更新:これは、そのメソッドに由来する無効な文字のリストですGetInvalidPathChars()

RealInvalidPathChars = new char[] { 
        '"', '<', '>', '|', '\0', '\x0001', '\x0002', '\x0003', '\x0004', '\x0005', '\x0006', '\a', '\b', '\t', '\n', '\v', 
        '\f', '\r', '\x000e', '\x000f', '\x0010', '\x0011', '\x0012', '\x0013', '\x0014', '\x0015', '\x0016', '\x0017', '\x0018', '\x0019', '\x001a', '\x001b', 
        '\x001c', '\x001d', '\x001e', '\x001f'
     };

したがって、基本的に以下は無効なパス文字です。ASCII/ Unicode文字1〜31、引用符( ")、より小さい(<)、より大きい(>)、パイプ(|)、バックスペース(\ b)、nullが含まれる場合があります。 (\ 0)およびタブ(\ t)。

元の文字列では発生しないようです。

于 2009-09-10T02:29:39.097 に答える