找到一个多重长度的字符串

时间:2015-06-17 12:58:54

标签: ruby regex validation

我必须找到长度为7且小于35的倍数的每个单词。我可以使用某些模式,如

/\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}

4 个答案:

答案 0 :(得分:8)

这样的事情可以解决问题

/\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

答案 1 :(得分:2)

这个应该有效:

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

它匹配班级[A-Za-z0-9]的每个字符,length 7的每个子词及其5的产品。

e.g。

12345672234567
abcdefghijklmn

但不是12345678

修改 将\ w替换为[[:alnum]],因为此POSIX类仅包含字母和数字。

答案 2 :(得分:0)

假设你打破了非单词字符上的单词(如果在空格上打破,请使用String#split):

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

答案 3 :(得分: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