回答
的壓縮版本,使用積極前瞻運營商:
^(?=(.*[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
乾淨,簡單,有效。 – 2009-08-23 08:23:37
其實,這隻會檢查至少有*兩位數和至少*四個字母。它的工作原理不管,因爲你不能有任何超過2個位數+ 4個字母,並拿出正好六個字符,但就解釋去... :) – hobbs 2009-08-23 08:58:16
用於驗證準確'x'數字的正則表達式的工作片段和'y'字母就像是:'/ ^(?=([^ 0-9] * [0-9]){x} $)(?=([^ A-Za-z] * [A-Za -z]){y} $)/'但如果你問我整個想法過於聰明。如果你*有*做它與一些工具,只接受正則表達式進行驗證,好吧。但如果你不需要這樣做,那就說出你的意思吧。 :) – hobbs 2009-08-23 09:02:37
我不知道你是否可以只用一個正則表達式來完成,但你當然可以用兩個正則表達式來完成。這就是說在這個任務中使用正則表達式似乎有點過分。
在Perl中,我會做:
m/\d.*\d/ # match exactly 2 numeric characters
&&
m/(?:[[:alpha:]].*){4}/ # match exactly 4 alpha characters
我不認爲正則表達式是去這裏的路。
當然,你可以創建每個可能的數字和字母順序的交替,但你需要6 * 5 = 30。
我不知道用正則表達式來計算所需的任何方法。
你可以有一個正則表達式來檢查你有6個字母數字字符,然後手動進行計數。
也許這樣?
(?=[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}
那麼,它應該與這些例子aBCd22 a2b2CD 22aBcD abcd22 – kurozakura 2009-08-23 07:51:21
@kurozakura:根據這個網站,我的事:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression- tester.ashx – strager 2009-08-23 07:53:07
謝謝:) – kurozakura 2009-08-23 10:16:09
這個正則表達式應該這樣做:
^(?=[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}$).*
嘿,那看起來很像我的。 =] – strager 2009-08-23 08:06:37
^((?<digit>\d)|(?<alpha>[a-zA-Z])){6}
(?<-alpha>){4}(?(alpha)(?!))
(?<-digit>){2}(?(digit)(?!))$
這將匹配6個字符與正好2位和4字母。它通過抓住任何可能的東西,然後通過從計數器堆棧中彈出它們來計算結果來實現這一點。檢查this鏈接瞭解更多詳情。
- (?< -alpha>){4}表示'pop 4匹配堆棧'。如果無法彈出,它失敗
- (?(阿爾法)(?))的意思是「如果有一個字母匹配,尋找(?!),它總是失敗。
- ^和$匹配開始和結尾
- 1. 正則表達式來驗證至多2號和至多4個字母長度的字符串6
- 2. 正則表達式字母數字字符串+特殊字母
- 3. 2個字母后跟4個字符的正則表達式
- 4. 正則表達式函數4個字母和4個數字?
- 5. 這個字母數字字符串的正則表達式
- 6. 正則表達式檢查字符串的第二個字母
- 7. [字母數字]的正則表達式建議[字母數字.- _ @] 31個字符
- 8. 正則表達式模式的字母數字,// *和小數點最多2點
- 9. 正則表達式:拆分字符串字母數字/數字
- 10. 正則表達式在字符串上查找字母數字
- 11. 6-10個字母數字字符的正則表達式,至少有1個字母字符
- 12. 正則表達式 - 檢測字母數字字符串不是由非字母數字字符串包圍
- 13. 正則表達式檢查一個字符串是在兩個長度之間,只有字母和數字
- 14. 正則表達式匹配一個字母字母和數字
- 15. 如何正則表達式的字符串 - 長度爲8,第一個字符字母和其餘的數字
- 16. 長度爲3-5個字符的字母數字字符串的JavaScript正則表達式
- 17. 正則表達式可選的7個字母數字字符
- 18. 正則表達式是由四個字母6個字符長的字符串,然後2號
- 19. Swift:檢測非字母數字字符的正則表達式
- 20. 字符串上的字母數字正則表達式
- 21. [字母數字] _ [字母數字] _ [數字]的模式的正則表達式
- 22. 匹配4位數字和1位字母的字母數字字符串的正則表達式是什麼?
- 23. 正則表達式的除X和X個字母數字字符的字符串長度和最大長度6
- 24. 正則表達式的字母數字
- 25. 字母數字的正則表達式
- 26. 作爲所有字母或長度爲6的嚴格字母數字的Java單一正則表達式
- 27. 正則表達式來檢查字母,數字和符號
- 28. 使用正則表達式提取字母數字字符串
- 29. 正則表達式的字母數字字符串丟棄最後3個位數並最終初始0
- 30. Java的正則表達式來掩蓋字母數字字符串,並顯示最後4位數字
「最大」是多餘的嗎?它應該是2位數字,還是4個字母? – 2009-08-23 07:14:35
沒有更多的2位數和不超過4個字母 – kurozakura 2009-08-23 07:25:56
所以像「a2」或「」會匹配嗎? – strager 2009-08-23 07:35:05