我一定要找到它的长度是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键盘上输入正则表达式;这是痛苦的。 –