2012-10-15 73 views
3

我花了數小時試圖解決這個問題。正則表達式 - 防止重複字符

這裏是我的正則表達式的字符串:
^(?=.{4})(?!.{32})[a-zA-Z0-9_]+((\.(-\.)*-?|-(\.-)*\.?) [a-zA-Z0-9_]+)*$ -
您可以測試它here

這裏是我試圖acomplish(用戶名驗證):

  1. 字符串長度範圍 - >確定
  2. 字母,數字,_ - 。允許( - 和。不允許在開始和/或用戶名結尾處) - >確定
  3. 需要防止重複字符(超過5個字符行) - >需要幫助!
+1

請給出您想要匹配的字符串示例,它們當前正在失敗。很難說出「允許內聯5個字符以上的重複字符」的含義。你是說你想匹配「aaaaa」而不是「aaaa」? – meagar

+3

你需要*允許*重複字符或*防止*? – haynar

回答

3

此:

^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$ 

使用另一個(負)先行採取第三個條件的照顧。這一個將確保沒有字符,其次是4次。

我還使用\w來簡化你的角色類別,它代表[a-zA-Z0-9]。另外,正如F.J指出的那樣,您可以將前兩個預覽合併爲一個:

^(?=.{4,31}$)(?!.*(.)\1{4})\w[\w.-]+\w$ 
+0

+1,這比我的版本更清晰,因爲它是匹配的重複字符檢查,而不是它自己的預覽。 –

+0

夥計,你搖滾!非常感謝;現在我想咬我自己......浪費時間很害羞地問:-( – virrion

+0

沒問題:)。如果它解決了您的問題,請考慮接受答案(通過單擊綠色複選標記)以向其他人展示,未來誰可能會發現此問題,解決方案是什麼。 –

0

嘗試以下操作:

^(?=.{4,31}$)(?![-.])(?:(?!(.)\1{4})[-.\w])+(?<![-.])$ 

例子:http://regexr.com?32ffq

這是假設的,而不是允許你實際上意味着防止重複字符。