2016-11-06 12 views
2

ドットの繰り返しを防止しようとしました。 '数字/文字のみを許可する。Java regexで文字の繰り返しを防ぐ方法

"blah...blah".matches(rex)) //false 
"..blablah".matches(rex)) //false 
"blablah..".matches(rex)) //false 
"blab.lah".matches(rex)) //true 
"bla.blah".matches(rex)) //true 

私が使用してみました: ^(?!\.\.)([a-zA-Z0-9._\-]*)$ それだけで第二の例のために、どのように私はそれを動作させることができます動作しますか?

+0

regexを使用する必要がありますか? (より単純なオプションがあるかもしれません) – ItamarG3

+0

あなたはそれを解決しましたか? – ItamarG3

+1

はい私は正規表現を好む – Canttouchit

答えて

2

あなたはかなり近かったので、先読みを(?!.*\\.{2})に調整する必要があります。したがって、全体の正規表現は^(?!.*\\.{2})([a-zA-Z0-9._\-]*)$です。 .matches()でアンカーを使用する場合、文字列全体を一致させるためにアンカーを使用する必要はありません。

文字以外の数字を連続して繰り返したくない場合は、代わりに(?!.*([._-])\\1+)を使用してください。

+0

これは正常に動作しますか?私はhttp://www.regexplanet.com/advanced/java/index.htmlでそれをテストしたが、すべてが真だった。 – zygimantus

+0

バックスラッシュ地獄かもしれない?私の答えでは、バックスラッシュはエスケープされています(Java文字列として使用する必要があるように)が、エスケープされていません: '^(?!* * \。{2})([a-zA-Z0-9._ \ - ] *)$ ' –

+0

うん、私はそれを逃した。ありがとう。 – zygimantus

0

String.replace()を使用して、すべての'.'文字を削除します。

String a="blah...blah"; 
a = a.replace(".", ""); 
System.out.println(a); 

この出力はblahblahです。

2

撮影した文字への後方参照を使用します。

if (str.matches("(([\\w.-])(?!\\2))*")) 
    // no chars are repeated 

live demoを参照してください。

「文字、数字、アンダースコア、ドット、ダッシュ」は[\\w.-]と書くことができます。
\w == [a-zA-Z0-9_]最初と最後に表示されている場合、ダッシュをエスケープする必要はありません。

+0

あなたの例は非常に私はすべての繰り返しを検出しますが、それはすべての繰り返しを検出するに近いです 私はより具体的にしましょう、私はドット(。)チャコールの繰り返しを防止したい、 すべてのa-zA-Z0-9と - (ダッシュ)_(アンダースコア)\(バックスラッシュ)と。(ドットは順不同)を許可します。 パストラバーサルを防止したいので、これを尋ねます。 – Canttouchit

+0

バックスラッシュを書きました。私は普通のスラッシュを意味しました。 – Canttouchit

関連する問題