Рубиновая строка, разделенная на более чем один символ - PullRequest
1 голос
/ 11 октября 2011

У меня есть строка, скажем "Hello_World, я учусь, Ruby".Я хотел бы разбить эту строку на каждое отдельное слово, как лучше?

Спасибо!C.

Ответы [ 6 ]

5 голосов
/ 11 октября 2011

Вы можете использовать \ W для любого несловесного символа:

"Hello_World I am Learning,Ruby".split /[\W_]/
=> ["Hello", "World", "I", "am", "Learning", "Ruby"]

"Hello_World I am Learning,   Ruby".split /[\W_]+/
=> ["Hello", "World", "I", "am", "Learning", "Ruby"]
2 голосов
/ 11 октября 2011

Вы можете использовать String.split с шаблоном регулярных выражений в качестве параметра. Как это:

"Hello_World I am Learning,Ruby".split /[ _,.!?]/
=> ["Hello", "World", "I", "am", "Learning", "Ruby"]
1 голос
/ 11 октября 2011

String # Scan кажется подходящим методом для этой задачи

irb(main):018:0> "Hello_World    I am Learning,Ruby".scan(/[a-z]+/i)
=> ["Hello", "World", "I", "am", "Learning", "Ruby"]

или вы можете использовать встроенный механизм сопоставления \w

irb(main):020:0> "Hello_World    I am Learning,Ruby".scan(/\w+/)
=> ["Hello_World", "I", "am", "Learning", "Ruby"]
1 голос
/ 11 октября 2011
ruby-1.9.2-p290 :022 > str =  "Hello_World I am Learning,Ruby"
ruby-1.9.2-p290 :023 > str.split(/\s|,|_/)
=> ["Hello", "World", "I", "am", "Learning", "Ruby"] 
0 голосов
/ 11 октября 2011

Просто для удовольствия, версия с поддержкой Unicode для 1.9 (или 1.8 с Oniguruma):

>> "This_µstring has words.and thing's".split(/[^\p{Word}']|\p{Connector_Punctuation}/)
=> ["This", "µstring", "has", "words", "and", "thing's"]

Или, может быть:

>> "This_µstring has words.and thing's".split(/[^\p{Word}']|_/)
=> ["This", "µstring", "has", "words", "and", "thing's"]

Настоящая проблема заключается в определении того, какая последовательность символов составляет «слово» в этом контексте. Возможно, вы захотите взглянуть на Oniguruma docs для поддерживаемых свойств персонажа, В Википедии также есть некоторые замечания по свойствам .

0 голосов
/ 11 октября 2011

Хотя приведенные выше примеры работают, я думаю, что лучше разбивать строку на слова, разбивая их на символы, которые не считаются частью какого-либо слова. Для этого я сделал это:

str =  "Hello_World I am Learning,Ruby"
str.split(/[^a-zA-Z]/).reject(&:empty?).compact

Это утверждение делает следующее:

  1. Разбивает строку по символам, которые не находятся в алфавите
  2. Затем отклоняет все, что является пустой строкой
  3. И удаляет все нули из массива

Тогда он будет обрабатывать большинство слов. Приведенные выше примеры требуют перечисления всех символов, с которыми вы хотите сопоставить. Гораздо проще указать символы, которые вы не считаете частью слова.

...