2012-11-25 51 views
1

匹配的詞我用,長度爲4有1號和3大寫字母匹配的詞下面的正則表達式:可能包含1-2位

\b(?=[A-Z]*\d[A-Z]*\b)[A-Z\d]{4}\b 

我想知道的是我怎麼需要修改表達式以過濾掉長度爲10的單詞,其中包含0-2數字。

\b(?=[A-Z]*\d[A-Z]*\b)[A-Z\d]{10}\b 

這將爲1個occurence工作,但如何擴展它來過濾0和2號呢?

樣品:http://regexr.com?32u40

+1

是數字總是將是相鄰的?如果是這樣的話,這應該是:'\ b(?= [AZ] * \ d {0,2} [AZ] * \ b)[AZ \ d] {10} \ b' –

+0

@Asad是的,抱歉沒有提到它。 – Johan

回答

4

把長度檢查到前瞻:

\b(?=[A-Z\d]{10}\b)(?:[A-Z]*\d){0,2}[A-Z]*\b 

說明:

\b   # Start at a word boundary 
(?=   # Assert that... 
[A-Z\d]{10} # 10 A-Z/digits follow 
\b   # until the next word boundary. 
)   # (End of lookahead) 
(?:   # Match... 
[A-Z]*  # Any number of ASCII uppercase letters 
\d   # and exactly one digit 
){0,2}  # repeat 0, 1 or 2 times. 
[A-Z]*  # Match any number of letters 
\b   # until the next word boundary. 
+0

豎起大拇指。看起來是正確的,但仍然返回與「」前瞻匹配的值的正匹配,但是值包含的數字太多。添加一個過濾器來刪除這些:'x.match(/ \ b(?= [AZ \ d] {10})(?:[AZ] * \ d){0,2} [AZ] * \ b/g ).filter(function(y){return y.length == 10});' –

+0

@TheSmose:謝謝;我誤解了這個問題,並認爲應該有10個或更多字符。我糾正了正則表達式 - 一個額外的字邊界就足夠了,不需要過濾器。 –