Вам не нужно сначала извлекать все слова из строки, а затем выбирать слова, содержащие не менее четырех букв.Вместо этого вы можете просто извлечь нужные слова, используя String # scan с регулярным выражением.
str = "The Fox asked the stork, 'How is the soup?'? Très bon?"
str.scan /\p{Alpha}{4,}/
#=> ["asked", "stork", "soup", "Très"]
Регулярное выражение гласит: «Совпадение строк, содержащих 4 или более букв».Я использовал \p{Alpha}
(так же, как \p{L}
и [[:alpha:]]
) для сопоставления букв Unicode.(Они описаны в Regexp . Найдите здесь эти выражения.) Вы можете заменить \p{Alpha}
на [a-zA-Z]
, но в этом случае "Très" не будет совпадать.
ЕслиВы также хотите сопоставить цифры, используйте \p{Alnum}
или [[:alnum:]]
.Хотя \w
также соответствует буквам (только на английском языке) и цифрам, он также соответствует символам подчеркивания, что, вероятно, нежелательно в этой ситуации.
Знаки пунктуации могут быть проблемой, когда слова извлекаются из строки путем разбиенияна пробел.
arr = "That is a cow.".split
#=> ["That", "is", "a", "cow."]
arr.select { |word| word.size >= 4 }
#=> ["That", "cow."]
, но "cow"
имеет только три буквы.Если вместо этого вы использовали String#scan
для извлечения слов из строки, вы получите желаемый результат.
arr = "That is a cow?".scan /\p{Alpha}+/
#=> ["That", "is", "a", "cow"]
arr.select { |word| word.size >= 4 }
#=> ["That"]
Однако, если вы используете scan
, вы также можете использовать регулярное выражение для извлечения только слов, имеющихминимум 4 символа и пропустите дополнительный шаг.