2015-07-02 58 views
4

我需要幫助爲用戶名建立一個正則表達式。稍微複雜的用戶名正則表達式

用戶名有三個部分。第一個字符,中間組,最後一個字符。

下面是規則我必須遵循:

  • 第一個字符必須是小寫字母,例如(a-z)
  • 中間的字符組必須只有4個或更多個字母和數字,例如(a-zA-Z0-9)
  • 中間組必須至少包含一個字母和一個數字
  • 的最後一個字符必須是數字(0-9)

一些例子:

hTes38  (i.e. h Tes3 8) 
j347k6  (i.e. j 347k 6) 
atksde21D2 (i.e. a tksde21D 2) 

這裏是我到目前爲止,這幾乎是:

^[a-z][a-zA-Z0-9]\w{1,}[0-9]$ 

但是middl e組是不正確的,我不知道如何執行'必須包含一個字母和一個數字'的規則。

+0

爲什麼你嘗試在它'\ w'?當它應該是4或更多時,爲什麼你有'{1,}'? – ooga

+0

@ooga在一個階段,我使用了4,然後試圖讓它在一個階段使用單詞,因此(\ w)和{1,},並嘗試許多其他變體。因此我發佈了不準確的正則表達式。道歉。 –

回答

5

使用兩個看aheads(一個一個字母和一個用於數字)斷言,中間部分至少有一個字母和一個數字:

^[a-z](?=.*[a-zA-Z])(?=.*\d.*.$)[a-zA-Z\d]{4,}\d$ 

注意,提前找一個數字(?=.*\d.*.$).*.$結尾,它確保整個輸入的最後一位數字不會被計算爲中間部分的數字(最後一個點使用最後一位數字,因此\d無法匹配)。

查看live demo與您的樣品和一些邊緣情況。

請參閱this external article瞭解四周的情況。

+0

有一個小錯誤:第一個字符應該是(a-z)。 –

+0

@kirmir哎呀 - 感謝您的 – Bohemian

+0

試圖讓我的頭周圍的「看aheads」,非常感謝!閱讀這些以充分理解它。 –

1

如果你需要在一個單一的正則表達式中做到這一點,波希米亞有正確的答案。但是,根據您使用的語言/平臺,運行通過if語句連接的多個正則表達式可能更乾淨更快。

if input.matches('^([a-z])([a-zA-Z0-9]{4,})([0-9])$')) 
    if (matches[1].matches('\d') && matches[1].matches('[a-zA-Z]') 
    return $true 

return $false 

如果您不能使用超前功能,也可以使用。

+0

在數據註釋中使用ASP.NET MVC(C#),AFAIK必須使用單個語句。但是,謝謝你。 –

0

如果你想要的東西更直接和原始的,你總是可以嘗試

\d[a-zA-Z][a-zA-Z0-9][a-zA-Z0-9]|\d[a-zA-Z0-9][a-zA-Z][a-zA-Z0-9]| 
\d[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z]|[a-zA-Z]\d[a-zA-Z0-9][a-zA-Z0-9]| 
[a-zA-Z0-9]\d[a-zA-Z][a-zA-Z0-9]|[a-zA-Z0-9]\d[a-zA-Z0-9][a-zA-Z]| 
[a-zA-Z][a-zA-Z0-9]\d[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z]\d[a-zA-Z0-9]| 
[a-zA-Z0-9][a-zA-Z0-9]\d[a-zA-Z]|[a-zA-Z][a-zA-Z0-9][a-zA-Z0-9]\d| 
[a-zA-Z0-9][a-zA-Z][a-zA-Z0-9]\d|[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z]\d 

的中間部分。這似乎工作得很好,但我沒有測試每種可能的組合。

後面的一般邏輯是交替數字的位置(從位置0到1到2到3),然後在其餘位置之間交替字符的位置(例如,如果數字位於位置1,字符從0到2交替爲3),最後用數字或字符填充剩餘的兩個位置。

注:我絕對不會聲稱這是最好的解決辦法,但它是一個解決方案不過。

+0

有用,請記住這個方法,謝謝。總是有好的另一種方法。 –

+0

不要爲這個問題用'\ w',因爲它'_' – nhahtdh

+0

哎呦比賽,我想我設法避免這些陷阱,但我想不會。它也匹配數字,這不是我想要的。無論如何,固定。 – Xiyng

0

如果你打算爲清楚起見/簡單,並且不侷限於單一的正則表達式:

import re 
s = "hTes38" 
first, middle, last = s[0], s[1:-1], s[-1] 
answer = bool(first.isalpha() and   # The first character must be a lower case letter 
     last.isdigit() and     # The last character must be a number 
     len(middle) >= 4 and    # The middle group of characters must be 4 or more characters 
     re.search("[a-zA-Z]", middle) and # The middle group must contain at least one letter 
     re.search(r"\d", middle) and  # AND one number 
     re.match(r"[a-zA-Z\d]+$", middle)) # The middle group of characters must be letters and numbers only