2009-08-23 27 views

回答

7

的壓縮版本,使用積極前瞻運營商:

^(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}$ 

說明:

(?=(.*[0-9]){2}) # asserts that you have 2 digits 
(?=(.*[A-Za-z]){4}) # asserts that you have 4 characters 
[A-Za-z0-9]{6} # does the actual matching of exactly 6 alphanumeric characters 

一個簡單的測試的情況下,在Python:

import re 
rex = re.compile('(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}') 
tests = ['aBCd22', 'a2b2CD', '22aBcD', 'asd2as', '', '201ABC', 'abcA213'] 
for test in tests: 
print "'%s' %s" % 
     (test, "matched" if rex.match(test) != None else "didn't match") 

輸出:

'aBCd22' matched 
'a2b2CD' matched 
'22aBcD' matched 
'asdas' didn't match 
'' didn't match 
'201ABC' didn't match 
'abcA213' didn't match 
+0

乾淨,簡單,有效。 – 2009-08-23 08:23:37

+0

其實,這隻會檢查至少有*兩位數和至少*四個字母。它的工作原理不管,因爲你不能有任何超過2個位數+ 4個字母,並拿出正好六個字符,但就解釋去... :) – hobbs 2009-08-23 08:58:16

+0

用於驗證準確'x'數字的正則表達式的工作片段和'y'字母就像是:'/ ^(?=([^ 0-9] * [0-9]){x} $)(?=([^ A-Za-z] * [A-Za -z]){y} $)/'但如果你問我整個想法過於聰明。如果你*有*做它與一些工具,只接受正則表達式進行驗證,好吧。但如果你不需要這樣做,那就說出你的意思吧。 :) – hobbs 2009-08-23 09:02:37

1

我不知道你是否可以只用一個正則表達式來完成,但你當然可以用兩個正則表達式來完成。這就是說在這個任務中使用正則表達式似乎有點過分。

在Perl中,我會做:

m/\d.*\d/ # match exactly 2 numeric characters 
    && 
m/(?:[[:alpha:]].*){4}/ # match exactly 4 alpha characters 
+0

非常聰明。你也可能需要檢查長度? – 2009-08-23 07:26:23

+0

您的\ d。* \ d理念爲我自己的答案提供了靈感。謝謝。 =] – strager 2009-08-23 07:51:33

+0

你的匹配沒有錨定,所以他們只檢查*至少有兩個數字和四個阿爾法在字符串中的某處存在。 – hobbs 2009-08-23 09:04:23

1

我不認爲正則表達式是去這裏的路。

當然,你可以創建每個可能的數字和字母順序的交替,但你需要6 * 5 = 30。

我不知道用正則表達式來計算所需的任何方法。

你可以有一個正則表達式來檢查你有6個字母數字字符,然後手動進行計數。

0

也許這樣?

(?=[a-z]*\d?[a-z]*\d?) 
(?![a-z]*\d[a-z]*\d[a-z]*\d) 
(?=\d*[a-z]?\d*[a-z]?\d*[a-z]?\d*[a-z]?) 
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]) 
[\da-z]{2,6} 

它通過確保選擇具有零個,一個或兩個數字(第一個超前掃描),但沒有超過兩個(第二前瞻)。同樣,它會檢查零到四個字母(第三個預測),但不會超過四個(第四個預測)。第五行匹配1到6個字符。

如果您只想匹配單詞,請將其包裝在\b中。

編輯:現在你添加了匹配長度的要求是六個字符。只需要稍作修改:

(?=[a-z]*\d[a-z]*\d) 
(?![a-z]*\d[a-z]*\d[a-z]*\d) 
(?=\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]) 
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]) 
[\da-z]{6} 
+0

那麼,它應該與這些例子aBCd22 a2b2CD 22aBcD abcd22 – kurozakura 2009-08-23 07:51:21

+0

@kurozakura:根據這個網站,我的事:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression- tester.ashx – strager 2009-08-23 07:53:07

+0

謝謝:) – kurozakura 2009-08-23 10:16:09

0

這個正則表達式應該這樣做:

^(?=[a-zA-Z]*\d[a-zA-Z]*\d[a-zA-Z]*$)(?=\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*$).* 

或者更緊湊:

^(?=[a-zA-Z]*(?:\d[a-zA-Z]*){2}$)(?=\d*(?:[a-zA-Z]\d*){4}$).* 
+0

嘿,那看起來很像我的。 =] – strager 2009-08-23 08:06:37

0
^((?<digit>\d)|(?<alpha>[a-zA-Z])){6} 
(?<-alpha>){4}(?(alpha)(?!)) 
(?<-digit>){2}(?(digit)(?!))$ 

這將匹配6個字符與正好2位和4字母。它通過抓住任何可能的東西,然後通過從計數器堆棧中彈出它們來計算結果來實現這一點。檢查this鏈接瞭解更多詳情。

  • (?< -alpha>){4}表示'pop 4匹配堆棧'。如果無法彈出,它失敗
  • (?(阿爾法)(?))的意思是「如果有一個字母匹配,尋找(?!),它總是失敗。
  • ^和$匹配開始和結尾
相關問題