我必须找到长度为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}
答案 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