2017-06-16 15 views
1

英数字のみを許可する文字列を検証し、 Javaでは1ドット文字とアンダースコア文字のみを検証したいと考えています。Java正規表現の検証

String fileName = (String) request.getParameter("read"); 

は私がリクエストから取り出すファイル名を検証する必要があると 私は"^[a-zA-Z0-9_'.']*$"にしようとした

上記の基準を満たす必要がありますが、これは

は私を検証する必要があり、複数のドット文字を許可します指定されたシナリオの文字列、

1。 Filenameにはアルファベットの数値のみが含まれます。 2。 1つのドット文字(。)しか使用できません。例:fileRead.pdf、 fileWrite.txtなど 3。それはアンダースコア文字のみを許可します。他のすべてのシンボルは である必要があります。

誰でも助けてもらえますか?

+2

あなたは、入力、出力の例をしてください共有することができますか? –

+0

https://regex101.com/このオンラインサービスでは、正規表現を試してみて、正規表現で本当にうまくやっていることを説明しています。それは自己学習のために非常に良いです:) –

+0

ファイル名にファイル拡張子が含まれているかどうかを指摘する必要があります。あなたのパターンは最後のドットと最初のドットを許可します。 – mattn

答えて

2

あなたはString.matchesを使用する必要があります()メソッド

System.out.println("My_File_Name.txt".matches("\\w+\\.\\w+")); 

またのjava.util.regexパッケージを使用することができます。より多くの情報についてREGEXとJAVAについては

java.util.regex.Pattern pattern = 
java.util.regex.Pattern.compile("\\w+\\.\\w+"); 

java.util.regex.Matcher matcher = pattern.matcher("My_File_Name.txt"); 

System.out.println(matcher.matches()); 

、このページを見て: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

+0

'matcher.find()'ではなく 'matcher.matches()'を使用してください。あなたの答えの正規表現の部分は 'ßαd.txt'(あるいは悪い:' ......... a.txt')のような入力を受け入れます。 'matches()'を使うと、それはもう大文字となることはありません。 –

+0

二重バックスラッシュをエスケープする必要があります。 – mattn

+0

ありがとうオリビエ –

0

まず、数値制限のある特殊文字を確認できます。

int occurance = StringUtils.countOccurrencesOf("123123..32131.3", "."); 

または

int count = StringUtils.countMatches("123123..32131.3", "."); 

それはあなたの要求と一致しない場合は、正規表現のチェックの前にそれを破棄することができます:ここで コードです。 問題がなければ、文字列を英数字値のチェックにすることができます。あなたがここに2つの負の先読み使用することができます

1

^((?!.*\..*\.)(?!.*_.*_)[A-Za-z0-9_.])*$ 

を各先読みは、ドットまたはアンダースコアのいずれかがそれは、最高1回発生する可能性があることを示唆し、2回発生していないと主張しています。

のドットとアンダースコアが必要かどうかは完全にはっきりしませんでした。私はそうではないと仮定しましたが、私の正規表現はこの要件に簡単に変更できました。

Demo