ruby如果string包含严格的字符

时间:2013-11-21 19:53:11

标签: ruby

我有一个数组:

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

我想检查一个字符串是否包含该数组中的任何单词 - 但只包含该单词(不是子字符串)。

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

但是,上面的内容会将count增加1,因为它会从我的字符串中的word中获取mad made。我怎样才能搜索疯狂并确保made不被计算?

5 个答案:

答案 0 :(得分:3)

array intersection operator &在这里很有用。

这里有两个选项,具体取决于您定义“单词”的方式:

1)如果一个单词是任何非空白字符序列,那么你可以这样做:

array & string.split

在您的示例中,这会导致数组和字符串中的单词交叉,这是空的。

2)如果一个单词是包含_的任何字母数字字符序列,那么你可以这样做:

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

例如,如果array = ["abhor", "rage", "mad", "cake"],那么上面的#1将为空(因为您的cake.在字符串中有句点)但是会为方法#2返回['cake']

答案 1 :(得分:2)

我会这样做:

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

答案 2 :(得分:1)

进行简单拆分的问题在于它不会考虑标点符号。你需要的是正则表达式,这有点复杂。

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

答案 3 :(得分:0)

首先尝试拆分单词。

words = string.split
count = 0

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

答案 4 :(得分: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