2013-11-21 4 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 

Однако вышеуказанные действия увеличивают count на 1, потому что это собирание wordmad из made в моей строке. Как я могу искать только безумный и гарантировать, что 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/истинно, но не/\ Wrage \ W /. – AndyV

3

The array intersection operator& полезно здесь.

Вот два варианта, в зависимости от того, как вы определяете «слово»:

1) Если слово любая последовательность непробельных символов, то вы можете сделать:

array & string.split 

В вашем примере , это приводит к пересечению массива и слов в строке, которая пуста.

2) Если слово любая последовательность алфавитно-цифровых символов, включая _, то вы можете сделать:

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

Например, если array = ["abhor", "rage", "mad", "cake"] затем # 1 выше будет пустой (потому что у вас есть cake. с периодом строка), но вернет ['cake'] для метода # 2.

2

Я хотел бы сделать это следующим образом:

array = ["abhor", "rage", "mad"] 
string = 'I made a cake.' 
string.split.count{|word| array.include?(word)} 
Смежные вопросы