2011-08-04 62 views
0

我需要一個正則表達式在.net中使用,將匹配用戶名作爲firstname或firstname.lastname的最大長度爲50個字符。名字的情況很簡單,但用firstname.lastname我不知道如何在姓氏中只允許50減去len(firstname。)。正則表達式匹配firstname.lastname或只是名字與長度限制

^([a-zA-Z]{1,50})|([a-zA-Z]+[.][a-zA-Z]+)$ 

將匹配firstname案例,但firstname.lastname的第二個案例將允許名字和姓氏中的無限字符。

+2

爲什麼它必須是正則表達式? –

回答

1
^(?i)(?=(?:[a-z]\.?){1,50}$)[a-z]+(?:\.[a-z]+)?$ 

將只匹配如果[a-z]的號碼是1和50之間

如果總長度不能超過50個,你可以用這個來代替:

^(?i)(?=.{1,50}$)[a-z]+(?:\.[a-z]+)?$ 
+1

好的+1。 FWIW - 長度斷言可以縮短爲:'(?!。{51})' – ridgerunner

+0

我認爲隨着@ridgerunner的改變,這是最乾淨的^(?i)(?!。{51})[az] + (?:\。[az] +)?$ –

+0

我在.net服務器端代碼中測試了它,它工作正常,但是我在RegularExpressionValidator中使用了表達式,並且在Firebug中使用了這個錯誤消息'invalid quantifier?i)( ?!。{6})[az] +(?:[。] [az] +)?$)顯然,Javascript不支持命名捕獲,所以表達式必須是'^(?!。{51}) [a-zA-Z] +(?:[。] [a-zA-Z] +)?$'不同的是我取出了忽略情況部分。 –

1

這會做到這一點。

^(?:([a-zA-Z]{1,50})|(?=.{1,51}$)[a-zA-Z]+[.][a-zA-Z]+)$ 

實質上,我加了環視說匹配(而不捕獲)1-51個字符,然後行的結尾。我使用了51,因爲我認爲.應計入長度計算中。

+1

匹配字符串'foo#¤%&/ bar'。猜猜爲什麼。 ;-) – Qtax

+0

這似乎允許任何數量的沒有句號的字母或任何數量的字母,後面跟着任意數量的字母后跟任意數量的字母。也允許在字母之間的任何位置有任意數量的句點。比我所擁有的還要糟糕。 –

+0

@Qtax好點。固定。 :) –

0

使用兩步驗證會容易得多,我沒有看到避免它的理由。

+0

你的意思是在正則表達式通過後驗證代碼長度? –

+0

是的,這就是我的意思 –

2

輕鬆完成。這是一個帶有註釋正則表達式的C#代碼片段:

if (Regex.IsMatch(userNameString, 
    @"# Match username with max length of 50 chars 
    ^   # Anchor to start of string. 
    (?!.{51}) # Assert length is 50 or less. 
    [A-Za-z]+ # First name. 
    (?:   # Optional second name. 
     \.   # Required dot separator. 
     [A-Za-z]+ # Last name. 
    )?   # Last name is optional. 
    $   # Anchor to end of string. 
    ", 
    RegexOptions.IgnorePatternWhitespace)) { 
    // Valid username 
} else { 
    // Invalid username 
} 
相關問題