如何在Ruby 2.0中从字符串数组中获取值

3

我有一个字符串数组:

array = [ "nike air", "nike steam","nike softy" ,"nike strength",
          "smooth sleeper","adidas air","addidas jogar","adidas softy","adidas heels"]

我希望能够从这个类似SQL的查询中提取字符串。

例如,如果用户输入单词“nike”。则应返回4个字符串作为结果。

           "nike air", "nike steam","nike softy" ,"nike strength"

例如,如果用户输入单词“adidas”,则应返回4个字符串作为结果。
           "adidas air","addidas jogar","adidas softy","adidas heels"

这可行吗?


3
你写了什么代码来解决这个问题?这是一件相当简单的事情。 - the Tin Man
虽然不是直接相关,但可能与此有关:SQL具有“LIKE”谓词,允许您在数据库层面上完成这个任务。它可能为您提供更灵活的解决方案。 - Matheus Moreira
4个回答

8
array.grep(query)

返回与查询匹配的数组子集。


array.grep('nike') 返回一个空数组。 - Kashiftufail
尝试使用正则表达式而不是字符串。 - Marek Lipka
1
@Kashiftufail,即使用/nike/代替'nike' - Stefan

7

使用Enumerable#grep方法:

matches = array.grep /nike/

在不区分大小写的情况下添加/i。从字符串构建正则表达式的方法如下:
re = Regexp.new( Regexp.escape(my_str), "i" )

或者,如果您希望用户能够使用特殊的正则表达式查询,请执行以下操作:

matches = array.grep /#{my_str}/

@Phrogh 当使用 array.grep /nike/ 时,可以给出准确的结果,但是当使用 array.grep /"nike"/ 时,却没有任何结果。那么在我的控制器中,我应该如何执行这段代码呢?可以使用 matches = array.grep /"#{params[:term]}"/ ,其中 params[:term] 是字符串值。 - Kashiftufail
1
使用 array.grep(Regexp.new(Regexp.escape(params[:term]))) - Stefan

2

或者你可以自己构建查询方法:

def func( array )
  array.each_with_object [] do |string, return_array|
    return_array << string if string =~ /nike/
  end
end

1
比必要的工作量(对程序员和计算机)要多得多。 - Phrogz
@Phrogz 绝对是针对程序员的问题 - grep 的实现是否类似于 C?否则,grep 不会做同样的事情吗?我现在无法检查。 - Dave Newton

2
array = [ "nike air", "nike steam","nike softy" ,"nike strength",
          "smooth sleeper","adidas air","addidas jogar","adidas softy","adidas heels"]
array.select{|i| i.include? "nike"}

# >> ["nike air", "nike steam", "nike softy", "nike strength"]

@louism 或许你应该解释一下你所提及的变化,并说明为什么这种方法是解决 OPS 问题的“最佳”方法。 - Daryl Gill
1
这种方法更清晰。在我看来,“选择包含‘nike’的单词”更简单、优雅,而且更符合 Ruby 的习惯用法。 - user2398029

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接