Проверить, частично ли существует элемент массива в данной строке - PullRequest
19 голосов
/ 30 марта 2011

У меня есть строка текста

this is the line

и я хочу вернуть true, если один из элементов в этом массиве:

['hey', 'format', 'qouting', 'this']

является частью строки, приведенной выше.

Таким образом, для строки выше следует вернуть true.

Для этой строки hello my name is martin не должно быть.

Я знаю include?, но я не знаю, как использовать это здесь, если это вообще помогает.

Ответы [ 4 ]

24 голосов
/ 30 марта 2011
>> s = "this is the line"
=> "this is the line"
>> ['hey', 'format', 'qouting', 'this'].any? { |w| s =~ /#{w}/ }
=> true
>> ['hey', 'format', 'qouting', 'that'].any? { |w| s =~ /#{w}/ }
=> false
>> s2 = 'hello my name is martin'
=> "hello my name is martin"
>> ['hey', 'format', 'qouting', 'this'].any? { |w| s2 =~ /#{w}/ }
=> false
15 голосов
/ 30 марта 2011

Самый простой из известных мне способов проверки наличия одной строки внутри другой:

text = 'this is the line'
words = ['hey', 'format', 'qouting', 'this']

words.any? { |w| text[w] }  #=> true

Нет необходимости в регулярных выражениях или в каких-либо сложных вещах.

require 'benchmark'

n = 200_000
Benchmark.bm(3) do |x|
  x.report("1:") { n.times { words.any? { |w| text =~ /#{w}/ } } }
  x.report("2:") { n.times { text.split(" ").find { |item| words.include? item } } }
  x.report("3:") { n.times { text.split(' ') & words } }
  x.report("4:") { n.times { words.any? { |w| text[w] } } }
  x.report("5:") { n.times { words.any? { |w| text.include?(w) } } }
end

>>          user     system      total        real
>> 1:   4.170000   0.160000   4.330000 (  4.495925)
>> 2:   0.500000   0.010000   0.510000 (  0.567667)
>> 3:   0.780000   0.030000   0.810000 (  0.869931)
>> 4:   0.480000   0.020000   0.500000 (  0.534697)
>> 5:   0.390000   0.010000   0.400000 (  0.476251)
6 голосов
/ 30 марта 2011

Вы можете разбить строку на массив и проверить пересечение между вашим массивом и вновь разделенным массивом, вот так.

Это удобно, потому что это даст вам больше, чем истинное ложное значение,это даст вам подходящие строки.

> "this is the line".split(' ') & ["hey", "format", "quoting", "this"]
=> ["this"] 

Если вам нужно значение true / false, вы можете легко сделать:

> s = "this is the line"
=> "this is the line" 
> intersection = s.split(' ') & ["hey", "format", "quoting", "this"]
=> ["this"] 
> intersection.empty?
=> false
1 голос
/ 30 марта 2011
> arr = ['hey', 'format', 'qouting', 'this']
=> ["hey", "format", "qouting", "this"]
> str = "this is the line"
=> "this is the line"
> str.split(" ").find {|item| arr.include? item }
=> "this"
> str.split(" ").any? {|item| arr.include? item }
=> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...