我一定要找到它的長度是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}
我一定要找到它的長度是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}
像這樣的東西應該做的伎倆
/\b(?:[a-zA-Z0-9]{7}){1,5}\b/
它匹配長度的字符串7,14,21,28,35
演示:https://regex101.com/r/eO4oG3/2
編輯:另一種可能性是使用反向引用
http://www.regular-expressions.info/backref.html
這似乎不適用於長度爲14的字,除了第一個實例 – depperm
這一個應工作:
\b([[:alnum:]]{7}){1,5}\b
它匹配[A-Za-z0-9]
類的每個字符,length 7
的每個子字及其產品與5
。
例如
12345672234567
abcdefghijklmn
但不12345678
編輯 取代了\ W與[[:alnum]因爲這POSIX類僅包含字母和數字。
假設你打破對非文字字符單詞(使用String#split
如果上破空格):
text.scan(/\w+/).select { |word| [7, 14, 21, 28].include?(word.size) }
這是一個更好的辦法,你可以得到使用正則表達式最接近的一次。
(?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
使用一到五個重複一組正好七個字符。 –
@JonathanLeffler我沒有明白,你能寫一個代碼示例嗎? –
就像@bro剛剛寫的答案一樣。我寧願不在iPad鍵盤上輸入正則表達式;這是痛苦的。 –