2015-06-17 125 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