Ruby:从字符串中提取单词

时间:2011-10-01 19:11:36

标签: ruby-on-rails ruby regex parsing

我正在尝试从字符串中解析单词并将它们放入数组中。我尝试过以下的事情:

@string1 = "oriented design, decomposition, encapsulation, and testing. Uses "
puts @string1.scan(/\s([^\,\.\s]*)/)

似乎可以做到这一点,但它有点不稳定(例如我应该包含更多特殊字符)。在红宝石中有更好的方法吗?

可选:我有cs课程说明。我打算从中提取所有单词并将它们放在一个字符串数组中,从生成的数组中删除英语中最常用的单词,然后将其余单词用作用户可用于搜索cs的标记课程。

5 个答案:

答案 0 :(得分:59)

拆分命令。

   words = @string1.split(/\W+/)

将基于正则表达式将字符串拆分为数组。 \ W表示任何“非单词”字符,“+”表示组合多个分隔符。

答案 1 :(得分:13)

好吧,你可以在空格上分割字符串,如果这是你感兴趣的分隔符

@string1.split(' ')

或拆分字边界

\W  # Any non-word character

\b  # Any word boundary character

或非言语

\s  # Any whitespace character

提示:尝试在http://rubular.com

上测试每一项

请注意,ruby 1.9与1.8

存在一些差异

答案 2 :(得分:12)

对我而言,分裂句子的最好方法是:

line.split(/[^[[:word:]]]+/)

即使使用多语言单词和标点符号也能完美运行:

line = 'English words, Polski Żurek!!! crème fraîche...'
line.split(/[^[[:word:]]]+/)
=> ["English", "words", "Polski", "Żurek", "crème", "fraîche"] 

答案 3 :(得分:1)

对于Rails,您可以使用以下内容:

@string1.split(/\s/).delete_if(&:blank?)

答案 4 :(得分:0)

我会这样写:

@string
  .split(/,+|\s+/)  # any ',' or any whitespace characters(space, tab, newline)
  .reject(&:empty?)
  .map { |w| w.gsub(/\W+$|^\W+^*/, '') } # \W+$ => any trailing punctuation; ^\W+^* => any leading punctuation
irb(main):047:0> @string1 = "oriented design, 'with', !!qwe,  and testing. can't rubyisgood#)(*#%)(*, and,rails,is,good"
=> "oriented design, 'with', !!qwe,  and testing. can't rubyisgood#)(*#%)(*, and,rails,is,good"
irb(main):048:0> @string1.split(/,+|\s+/).reject(&:empty?).map { |w| w.gsub(/\W+$|^\W+^*/, '')}
=> ["oriented", "design", "with", "qwe", "and", "testing", "can't", "rubyisgood", "and", "rails", "is", "good"]