我正在扫描不同商品的名称和描述,以查看是否有任何关键字匹配。
在下面的代码中,它会返回诸如“googler”之类的内容。或者' applecobbler',当我尝试做的只是获得完全匹配时:
[name, description].join(" ").downcase.scan(/apple|microsoft|google/)
我该怎么做?
答案 0 :(得分:6)
我的正则表达式技巧非常弱,但我认为你需要使用单词边界:
[name, description].join(" ").downcase.scan(/\b(apple|microsoft|google)\b/)
答案 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
将返回原始案例中的单词。
names
,descriptions
和targets
都可以来自数据库或单独的文件,有助于将数据与代码分开,并且需要在目标更改时修改代码。
我将使用目标词列表并使用Regexp.union快速构建模式。