2015-06-17 185 views
4

我一定要找到它的長度是7並且小於35的倍數,我可以使用像查找multiplicy長度的字符串

/\b([a-zA-Z0-9]{7}|[a-zA-Z0-9]{14}|[a-zA-Z0-9]{21}|[a-zA-Z0-9]{28})\b/ 

一些模式,但我希望能有像

一些更好的解決方案的每一個字
[a-zA-Z0-9]{7|14|21|28} 

甚至像

[a-zA-Z0-9]{7*k} 
+3

使用一到五個重複一組正好七個字符。 –

+0

@JonathanLeffler我沒有明白,你能寫一個代碼示例嗎? –

+0

就像@bro剛剛寫的答案一樣。我寧願不在iPad鍵盤上輸入正則表達式;這是痛苦的。 –

回答

2

這一個應工作:

\b([[:alnum:]]{7}){1,5}\b 

它匹配[A-Za-z0-9]類的每個字符,length 7的每個子字及其產品與5

例如

12345672234567 
abcdefghijklmn 

但不12345678

編輯 取代了\ W與[[:alnum]因爲這POSIX類僅包含字母和數字。

+1

\ w還包含下劃線_ http://www.regular-expressions.info/posixbrackets.html – bro

+0

問號的好處是什麼?如果你忽略它,它的工作原理是否相同? –

+0

是的,這個?在這裏不需要,我的壞,我把它拿出來。 與下劃線,我不知道:/ – nerdbeere

0

假設你打破對非文字字符單詞(使用String#split如果上破空格):

text.scan(/\w+/).select { |word| [7, 14, 21, 28].include?(word.size) } 
0

這是一個更好的辦法,你可以得到使用正則表達式最接近的一次。

(?i)\b(?=[a-z\d]{1,34}\b)(?:[a-z\d]{7})+\b

下面:'34'是最大長度可變的,'7'是多因素變量。
它們彼此獨立。
可以在運行時使用任何長度和多重變量值構造它。

(?i)       # No case 
\b       # Word boundary 
(?= [a-z\d]{1,34} \b)  # Max length = 34 
(?: [a-z\d]{7})+   # Multiple factor = 7 
\b       # Word boundary 

輸入:

length=7 aaaaaaa 
length=14 bbbbbbbbbbbbbb 
length=21 ccccccccccccccccccccc 
length=28 dddddddddddddddddddddddddddd 
length=35 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 

輸出:

** Grp 0 - (pos 10 , len 7) 
aaaaaaa 

------------- 

** Grp 0 - (pos 32 , len 14) 
bbbbbbbbbbbbbb 

------------- 

** Grp 0 - (pos 58 , len 21) 
ccccccccccccccccccccc 

------------- 

** Grp 0 - (pos 91 , len 28) 
dddddddddddddddddddddddddddd