1

ユーザーが私のプログラムにディレクトリ名を渡すとき、私はそれをチェックします

private static final Pattern    DIRECTORY_PATTERN   
            = Pattern.compile("/*?([a-zA-Z_0-9]+)/*?",
                    Pattern.CASE_INSENSITIVE);

これまで見てきたことでは、これは機能しますが、この正規表現は不完全であると思われます。

ディレクトリ名を検証する、より完全な正規表現を知っていますか、または提案できますか?

4

2 に答える 2

3

実際には、バックスペースや改行文字などの凶悪なものを含め、ファイル名に使用できる文字はもっとたくさんあります。実際、基盤となるファイル システムに依存する場合があります。実際のパスセパレーター以外のすべてを許可するルールをどこかで漠然と覚えています。

何かが有効かどうかを判断する際に常に考慮していることの 1 つは、それを使用することです。たとえば、(複雑な) 正規表現を使用して電子メール アドレスの形式を検証できますが、それが完全に有効であることを確認する唯一の方法は、ハイパーリンク メールを送信して受信を確認することです。

特定のケースで、その名前でファイルを作成したい場合は、実際にファイルを作成することが許可されているディレクトリに一時ファイルを作成しようとすることができます。ファイルが正常に作成された場合は、有効な名前です :-) もちろん、ファイルを作成している場合は、実際のファイルを作成したいだけかもしれません。既存のファイルを開く場合は、正規表現を忘れて、ファイルを開こうとしてください。正規表現複雑さは、ファイルが存在するか、読み取り可能かどうかを教えてくれません。

ただし、率直に言って、使用できる文字に独自の制限を設けることを検討します。過去に、CTRL 文字を含むファイル名を作成するほど愚かな人や-rfrmコマンドに問題があると呼ばれる人を呪いました。 (それを回避する方法がわかるまで)。

于 2012-07-10T16:21:34.917 に答える
0

これはファイルシステム固有です。受け入れられるシンボルのリストとディレクトリ名の制限については、使用する予定のFSのドキュメントを確認してください。存在するほとんどすべての最新のFSについて、すでに多くの句読点と数千の非ラテン記号が欠落しています。

于 2012-07-10T16:18:04.423 に答える