2016-11-06 98 views
2

我試圖防止重複點字符'。'並且僅允許數字/字母如何防止使用Java正則表達式重複字符

例如

"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

你必須使用正則表達式嗎? (可能有一個更簡單的選項) – ItamarG3

+0

你工作過嗎? – ItamarG3

+1

是的,我更喜歡正則表達式 – Canttouchit

回答

2

你非常接近,你需要調整前瞻到(?!.*\\.{2}),所以整體正則表達式是^(?!.*\\.{2})([a-zA-Z0-9._\-]*)$。請注意,與.matches()一起使用時,您不需要錨點,因爲它會嘗試匹配整個字符串。

如果您不想讓任何非字母/數字連續重複,您可以改爲使用(?!.*([._-])\\1+)作爲loalkahed。

+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