2015-02-08 108 views
5

我想創建一個regex驗證應符合以下的用戶名:允許正則表達式匹配用戶名

  • 只有一個特殊字符(._-),它絕不能以字符串的極值
  • 第一個字符不能是數
  • 所有允許的其它字符是字母和數字
  • 總長度應爲3之間和20個字符

這是一個HTML5驗證模式,很遺憾,它必須是一個大的正則表達式。

到目前爲止,這是我的本錢:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20} 

但正向前查找可重複超過一次允許超過一個特殊字符,這不是我想要的東西。而我不知道如何改正這一點。

+0

不是一個答案 - 但是你需要打破'.'在'[._-]'。 – amit 2015-02-08 10:44:11

+0

對於這個複雜的東西,你爲什麼選擇使用html驗證模式呢?您可以觸發處理驗證的事件而不是模式。 – Eclecticist 2015-02-08 10:46:18

+0

@amit [._-]是列表中的單個字符「._-」的字面意思,所以點不被認爲是任何字符,所以我認爲我不需要破壞它 – Tofandel 2015-02-08 10:48:40

回答

14

您應該將正則表達式分成兩個部分,使您的生活更輕鬆(不是兩個表達式!):

首先,匹配用戶名需要的格式爲: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

現在,我們只需要驗證長度約束。爲了不角落找尋與已發現的格局混亂,你可以使用非消耗比賽,只有驗證字符數(其litterally用於創建正則表達式的模式的黑客):(?=^.{3,20}$)

如果長度約束匹配,正則表達式只會嘗試匹配有效的格式。它是非消耗的,所以在成功之後,引擎仍然處於字符串的開始處。

所以,一起:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$ 

Regular expression visualization

Debuggex Demo

+1

謝謝大師的正則表達式,這個工程(我只需要取代最後*由一個+所以一個特殊的字符不能在最後 – Tofandel 2015-02-08 10:56:02

+1

@ Adri1du40指出,以及。已經修復了) – dognose 2015-02-08 10:56:19

0

我認爲你需要使用?而不是+,所以特殊字符只匹配一次或不匹配。

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

+0

這隻會允許一個特殊字符在字符串的開頭 – Tofandel 2015-02-08 10:52:51

+0

@ Adri1du40你確定嗎?我想'''基本上是'+',除了它只匹配零次或一次。 – 2015-02-08 10:55:23

+0

是的,這是'?'但是如果你讓一個字符在特殊字符之前爲零,那麼一個特殊的字符可以在開頭 – Tofandel 2015-02-08 11:00:45