Javaでは、File-Name-Stringを持っています。そこで、すべての不正な文字を「_」で置き換えたいが、a-z
、0-9
、-
、.
および_
私は次のコードを試しました:しかし、これはうまくいきませんでした!
myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
[a-zA-Z0-9.-]
以外のすべてを置き換える必要があります。括弧内の^
は「NOT」を表します。
myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
Windowsプラットフォームでオプションを探している場合は、ファイル名に「\ /:*?」<> |」以外のすべての有効な文字を使用する解決策を試してください。
fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
さらにシンプルに
myString = myString.replaceAll("[^\\w.-]", "_");
定義済みの文字クラス:
\w
単語文字:[a-zA-Z_0-9]
ここにはすでにいくつかの答えがあったことは知っていますが、与えられた提案を少し変更しなければならなかったことを指摘したいと思います。
filename.matches("^.*[^a-zA-Z0-9._-].*$")
これは、必要な結果を得るためにJavaの.matchesに使用しなければならなかったものです。これが100%正しいかどうかはわかりませんが、 a〜z A〜Z 0〜9(。)(_)および(-)以外の文字が検出された場合はtrue。
ここに私のロジックに欠陥があるかどうかを知りたいです。
以前の回答では、エスケープすべきものとすべきでないものについての議論を見てきました。この例では、何もエスケープせずに脱出しましたが、リストの最後にない限り式が「壊れる」ので、安全のために(-)マイナス文字をエスケープする必要があります。 (。)ドット文字は、([])四角括弧内でエスケープする必要はありませんが、エスケープしても問題はありません。
詳細については、Java Patterns を参照してください。
[A-Za-z0-9]のようなものを使用する場合は、 MS Naming Conventions をチェックし、「... 1〜31、...」。