2013-11-21 54 views
1

我有一个数组:红宝石如果字符串包括严格的字符

array = ["abhor", "rage", "mad"]

,我要检查,如果一个字符串包括阵列中的任何字 - 但是,只有这个词(不是子)。

string = 'I made a cake.' 
count = 0 
array.each do |word| 
    if string.include? word 
    count += 1 
    end 
end 

然而,上面的1,因为它是从made在我的字符串拿起wordmad不会增加count。我怎样才能搜索只有疯狂,并确保made不算?

回答

0

如果你愿意走下正则表达式,\ b代表一个单词边界。这个例子,其中包括所有的在你的句子中的单词和一些它们的片段,正确返回4.

array = ["abhor", "rage", "mad", "I", "made", "a", "cake", "cak"] 

string = 'I made a cake.' 
count = 0 
array.each do |word| 
    if string =~ /\b#{word}\b/ 
      count += 1 
    end 
end 
0

尝试先分开单词。

words = string.split 
count = 0 

words.each do |word| 
    count += 1 if array.include? word 
end 
1

做一个简单的拆分的问题是,它不会考虑到标点​​符号。你需要的是一个正则表达式,这有点复杂。

array.each do |word| 
    count += 1 if string.match(/\W#{word}\W/) 
end 
+1

您可能需要添加额外的在这个正则表达式的开始处的单词边界标记,以确保您不会捕获某些子字符串。例如“enrage”=〜/ rage \ W /为true,但不是/ \ Wrage \ W /。 – AndyV

3

array intersection operator&在这里很有用。

这里有两个选择,这取决于你如何定义“字”:

1)如果一个词就是非空白字符的序列,那么你可以做:

array & string.split 

在你的榜样,这会导致字符串中的数组和字的交集,这是空的。

2)如果一个词是字母数字字符,包括_任何序列,则可以这样做:

array & string.scan(/\w+/) 

例如,如果array = ["abhor", "rage", "mad", "cake"]然后#1的上方将是空的(因为你必须cake.具有周期中该字符串),但将返回方法#2的['cake']

2

我会做这样的:

array = ["abhor", "rage", "mad"] 
string = 'I made a cake.' 
string.split.count{|word| array.include?(word)}