2015-06-17 5 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; это больно. –

ответ

8

Что-то вроде этого следует сделать трюк

/\b(?:[a-zA-Z0-9]{7}){1,5}\b/ 

, который соответствует строкам длины 7,14,21,28,35

Демо: https://regex101.com/r/eO4oG3/2

EDIT: Еще одна возможность использовать обратные_связи
http://www.regular-expressions.info/backref.html

+0

это не работает со словами длины 14, кроме первого экземпляра – depperm

2

Это один должен работы:

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

Он соответствует каждому персонажу класса [A-Za-z0-9], каждому подслову length 7 и его продукту с 5.

например.

12345672234567 
abcdefghijklmn 

но не 12345678

EDIT Заменил \ ш с [[цифрой, буквой]], как это POSIX класс содержит только буквы и цифры.

+1

\ w также содержит подчеркивание _ http://www.regular-expressions.info/posixbrackets.html – bro

+0

В чем преимущество вопросительного знака? Работает ли она так же, если вы ее опускаете? –

+0

yep, the? здесь не нужно, я плохо, я его вынимаю. с подчеркиванием, я не знал: / – 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 
Смежные вопросы