如何扫描字符串以获得完全匹配的关键字?

时间:2012-11-27 16:31:07

标签: ruby ruby-on-rails-3 scanf

我正在扫描不同商品的名称和描述,以查看是否有任何关键字匹配。

在下面的代码中,它会返回诸如“googler”之类的内容。或者' applecobbler',当我尝试做的只是获得完全匹配时:

[name, description].join(" ").downcase.scan(/apple|microsoft|google/)

我该怎么做?

4 个答案:

答案 0 :(得分:6)

我的正则表达式技巧非常弱,但我认为你需要使用单词边界:

[name, description].join(" ").downcase.scan(/\b(apple|microsoft|google)\b/)

Rubular example

答案 1 :(得分:3)

取决于您想要的信息,但如果您只想要完全匹配,则不需要正则表达式用于比较部分。只需比较相关的字符串。

splitted_strings = [name, description].join(" ").downcase.split(/\b/)

splitted_strings & %w[apple microsoft google]
# => the words that match given in the order of appearance

答案 2 :(得分:0)

在正则表达式中添加适当的边界实体(\b)。您也可以使用#grep方法。而不是加入:

array.grep(your_regexp)

答案 3 :(得分:0)

看看这个问题,以及我想做这些事情的情况,这就是我为一个实际的程序做的事情,我有源列表及其相关文本,并想知道命中,我可能会写这样的东西:

require 'pp'

names = ['From: Apple', 'From: Microsoft', 'From: Google.com']
descriptions = [
  '"an apple a day..."',
  'Microsoft Excel flight simulator... according to Microsoft',
  'Searches of Google revealed multiple hits for "google"'
]
targets = %w[apple microsoft google]
regex = /\b(?:#{ Regexp.union(targets).source })\b/i

names.zip(descriptions) do |n,d|
  name_hits, description_hits = [n, d].map{ |s| s.scan(regex) }
  pp [name_hits, description_hits]
end

哪个输出:

[["Apple"], ["apple"]]
[["Microsoft"], ["Microsoft", "Microsoft"]]
[["Google"], ["Google", "google"]]

这会让我知道这些单词的字母大小写,所以我可以尝试区分Apple公司的苹果水果,并获得字数,帮助显示文本的相关性。

regex看起来像:

/\b(?:apple|microsoft|google)\b/i

它不区分大小写,但scan将返回原始案例中的单词。

namesdescriptionstargets都可以来自数据库或单独的文件,有助于将数据与代码分开,并且需要在目标更改时修改代码。 我将使用目标词列表并使用Regexp.union快速构建模式。