2011-05-23 63 views
5

我試圖寫一個用戶名驗證,具有以下限制:正則表達式來驗證用戶名與至少一個字母和特殊字符

  1. 必須包含至少1個字母(A-ZA- Z)
  2. 只能包含數字,字母等什麼,或者強調

下面的例子是有效的:ABC123,MY_NAME,12345a

下面的例子是無效的:123456,my_name !, _1235

我發現了一些關於使用積極lookaheads的字母contraint:(?=。* [a-zA-Z]),它看起來可能有某種負面向前看第二個約束,但我不知道如何將它們混合成一個正則表達式。 (注意......我並不十分清楚這個。*部分在向前看的內容......)

是這樣的:/(?=。* [a-zA-Z])(? !* [^ A-ZA-Z0-9 _])/

編輯:

因爲問題問一個正則表達式,我接受的答案是:

/^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/ 

然而,我實際上要實施的是Bryan Oakley建議將它分成多個小檢查。這使得在需求變化的情況下將來可以更容易地閱讀和擴展。謝謝大家!

而且因爲我這個標記用的Ruby-on-軌道,我會包括我實際使用的代碼:即解決您的問題

validate :username_format  

def username_format 
    has_one_letter = username =~ /[a-zA-Z]/ 
    all_valid_characters = username =~ /^[a-zA-Z0-9_]+$/ 
    errors.add(:username, "must have at least one letter and contain only letters, digits, or underscores") unless (has_one_letter and all_valid_characters) 
end 

回答

6

/^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/:0個或多個有效字符,後跟一個字母,後跟0個或多個有效字符,約束爲行的開始和結束。

+0

Sweet,它在第一次測試中缺少_或0以上的有效值,但除此之外,它的工作原理! – Paul 2011-05-23 20:02:37

2

最簡單的正則表達式是:

/^[a-zA-Z0-9][a-zA-Z0-9_]*$/ 

我鼓勵你現場試試http://rubular.com/

+0

這不是一個完美的解決方案:它不會允許12345a。 – 2011-05-23 19:34:00

+0

看起來這是非常接近的,但也強加了它必須以字母開頭的限制,所以12345a沒有通過。 – Paul 2011-05-23 19:35:03

+0

對不起,我認爲12345a無效:正確的是/^[a-zA-Z0-9] [a-zA-Z0-9 _] * $/ – 2011-05-23 19:36:47

6

很容易檢查模式是否有任何非法字符,並且很容易檢查是否至少有一個le的垃圾。試圖在一個正則表達式中做所有的事情會讓你的代碼難以理解。

我的建議是做兩個測試。把測試的功能,使你的代碼絕對死簡單的理解:

if no_illegal_characters(string) && contains_one_alpha(string) { 
    ... 
} 

對於前者,你可以使用該模式^[a-zA-Z0-9_]+$,對於後者,你可以使用[a-zA-Z]

如果您不喜歡可以使用的額外功能,只是不要嘗試用一個難以閱讀的正則表達式來解決問題。沒有獎勵積分可以將盡可能多的功能填充到一個表達式中。

+0

你是對的,沒有必要過分複雜這一點。 – Paul 2011-05-23 20:03:15

+0

布賴恩在你的「no_illegal_characters()」正則表達式中有一個小錯誤。正如現在正則表達式所說的「字符串從開始到結束必須只有1個字符」。而不是'^ [a-zA-Z0-9 _] $'它應該是'^ [a-zA-Z0-9 _] + $'。 – 2012-02-11 04:44:30

+0

謝謝@wyatt,我改變了表達式以包含'+' – 2012-02-11 12:41:34

相關問題