2009-08-24 46 views
2
    字符串的
  1. 最大長度爲6。
  2. 該字符串應該含有至多2個數字
  3. 字符串應當含有最多4字母

所以下面的例子應該匹配正則表達式來驗證至多2號和至多4個字母長度的字符串6

abcd22 

a1cd3d 

11acde 

a1c 

1ad 
+2

怎麼樣,沒有數字,沒有字母串字符? – 2009-08-24 19:18:36

+0

字符串可以包含比2度4的限制少了? 「1a2」是否有效? – Amy 2009-08-24 20:57:03

+0

是其有效的,但沒有串數字,沒有字母是不是在這種情況下,有效 – kurozakura 2009-08-25 02:29:13

回答

1

你想要的東西在正則表達式中是不可能的,因爲正則表達式不能計數,這在這裏是需要的。實際上,正則表達式似乎能夠以直接序列計數字符,例如,在這種情況下:

/x{2,3}/ # 2 or 3 ‘x’s 

...但是這其實還不算,因爲它只是這個表情的快捷方式:

/xxx?/ 

即2 x的,跟着一個可選的第三個。

另一方面,您的表情必須跟蹤表示表達式的整個自動機的兩個不同計數器。這在經典的正則表達式中是不可能的(並且仍然很難使用更多的現代正則表達式使用下推自動機來保存狀態)。

0

的正則表達式不擅長跟蹤狀態。你可以用正則表達式做到這一點,但它會更容易使用一個簡單的計算器和小正則表達式程序:

bool IsValid(string s) 
{ 
    int numInts = 0; 
    int numChars = 0; 
    Regex isDigit = new Regex(@"\d"); 
    Regex isChar = new Regex(@"[a-zA-Z]"); // NOTE: will NOT catch non english letters 

    if (s.Length() <= 6) 
    { 
     return false; 
    } 

    foreach (char c in s) 
    { 
     if (isDigit.IsMatch(c)) 
     { 
      ++numInts; 
     } 
     if (isChar.IsMatch(c)) 
     { 
      ++numChars; 
     } 
    } 

    return numInts == 2 && numChars == 4; 

}

Constify /重命名參數傳遞給滿足您的需求。

當然,如果你想成爲一個非常喜歡的人,你可以在字符上進行數字比較,但這會進一步讓你遠離一個穩固的,強大的解決方案。

2

我做了一堆正則表達式中的一個或測試:

/^[a-z0-9]{0,6}$/ # at most 6 characters 
/([a-z].*){5}/ # more than 4 letters 
/(\d.*){3}/  # more than 2 digits 

所以:

if (/^[a-z0-9]{0,6}$/ and !(/([a-z].*){5}/ or /(\d.*){3}/)) { 
    print "valid"; 
} 
+0

「A/10」驗證...... – 2009-08-24 19:27:36

+0

我沒有看到任何問題,將意味着其他字符不應驗證 – naumcho 2009-08-24 20:57:03

+0

最大應是4個字母和最多2個位數即字母<= 4和數字<= 2 – kurozakura 2009-08-25 02:34:07

1

我不會用正則表達式爲這一個,也許除了檢查字母/更少比6:/^[0-9a-z]{1,6}$/i。但計數條件,雖然使用正則表達式在技術上是可行的,但通過簡單計數可以更好地完成。

,所以我會

  1. 測試它是否匹配正則表達式/^[0-9a-z]{1,6}$/i
  2. 然後用一個for循環計數chararcter CLASSE OCCURENCES
0

你可以做到這一點使用負向前看符號。

(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6} 

(?!\d{5})如果5首或更多個數字被發現

(?![a-z]{3})如果這兩個通的,我們終於驗證有1首6個字母數字之間如果3個或更多的字符被發現

失敗失敗與(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

相關問題