Ruby on rails Ruby:从字符串中提取单词

Ruby on rails Ruby:从字符串中提取单词,ruby-on-rails,ruby,regex,parsing,Ruby On Rails,Ruby,Regex,Parsing,我试图从字符串中解析单词,并将它们放入数组中。我试过以下方法: @string1 = "oriented design, decomposition, encapsulation, and testing. Uses " puts @string1.scan(/\s([^\,\.\s]*)/) 它似乎能做到这一点,但它有点不稳定(例如,我应该包括更多的特殊角色)。在ruby中有更好的方法吗 可选:我有一个cs课程描述。我打算从中提取所有单词并将它们放入字符串数组中,从生成的数组中删除英语中最常

我试图从字符串中解析单词,并将它们放入数组中。我试过以下方法:

@string1 = "oriented design, decomposition, encapsulation, and testing. Uses "
puts @string1.scan(/\s([^\,\.\s]*)/)
它似乎能做到这一点,但它有点不稳定(例如,我应该包括更多的特殊角色)。在ruby中有更好的方法吗

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

split命令

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

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

如果您感兴趣的分隔符是空格,则可以拆分字符串

@string1.split(' ')
或者在单词边界上拆分

\W  # Any non-word character

\b  # Any word boundary character
或者在非文字上

\s  # Any whitespace character
提示:尝试在上测试每一个


请注意,ruby 1.9与Rails的1.8有所不同,您可以使用如下内容:

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

对我来说,最好的分句方法是:

line.split(/[^[[:word:]]]+/)
即使使用多语言文字和标点符号也能完美地工作:

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

我会这样写:

@string1.split(/\s/).delete_if(&:blank?)
@string
.split(/,++\s++/)#any',或任何空白字符(空格、制表符、换行符)
.拒绝(&:空?)
.map{| w | w.gsub(/\w+$| ^\w+^*/,'')任何尾随标点符号^\W+^*=>任何前导标点符号

英语很难用正则表达式解析。您考虑过自然语言解析器吗?它将更准确地识别句子中句点之间的差异。
史密斯先生在这里。
并返回
先生。
作为一个包含点的单词,但是
这里没有点。@MarkByers,很好的一点,我在这一点上没有。我会调查的。非常感谢。正如david nehme在回答中所指出的,您可能希望使用+运算符来指示一个或多个与该模式匹配的连续字符。此外,扫描对于从文本中提取匹配模式非常有用,并且可以与上面的拆分建议相反,例如s.scan(/w+/)谢谢您的许多好建议!今天早上我玩了很多rubular,这是一个很棒的教学工具。我只是在实现将所选模式提取到代码中时遇到了问题@string1.split(%r{\W+})似乎工作得很好,但是MarkByers(上面的评论员)在自然语言解析方面有一个很好的观点,所以我需要记住它。无论如何,谢谢你!注BF4在其评论中缺少反斜杠,应该是:
s.scan(/\w+/)
这并不总是有效的。“CaféRestaurant”.split(/\W+/)=>[“Caf”,“Restaurant”]会删除特殊字符。数字也有问题:
“8.3”。split(/\W+/)=>[8.3]
只需使用
strip
首先删除空格,因此:
@string.strip.split(/\W+/)
这不适用于缩略词“you're”和“it's”@lazzy.developer给出的以下答案也适用于多语言单词、特殊字符和标点符号,如本例所示:谢谢。对非拉丁语单词很有效。那么缩略语呢?[“can”,“t”]处理缩略语不处理缩略语。您可以尝试
line.split(/[^[:word:]']+/)
,但所有
'words'
仍然是
'words'