关于ruby:匹配数组中的模式

Match a pattern in an array

有一个包含2个元素的数组

1
test = ["i am a boy","i am a girl"]

我想测试是否在数组元素中找到字符串,比如:

1
2
test.include("boy")  ==> true
test.include("frog") ==> false

我能那样做吗?


使用正则表达式。

1
2
3
4
test = ["i am a boy" ,"i am a girl"]

test.find { |e| /boy/ =~ e }   #=>"i am a boy"
test.find { |e| /frog/ =~ e }  #=> nil


好吧,你可以这样grep(regex):

1
test.grep /boy/

甚至更好

1
test.grep(/boy/).any?


你也可以做

1
2
3
4
5
6
7
test = ["i am a boy" ,"i am a girl"]
msg = 'boy'
test.select{|x| x.match(msg) }.length > 0
=> true
msg = 'frog'
test.select{|x| x.match(msg) }.length > 0
=> false

我取了peters片段并对其进行了一些修改,以匹配字符串而不是数组值。

1
2
ary = ["Home:Products:Glass","Home:Products:Crystal"]
string ="Home:Products:Glass:Glasswear:Drinking Glasses"

用途:

1
ary.partial_include? string

数组中的第一个项将返回true,它不需要匹配整个字符串。

1
2
3
4
5
6
7
8
class Array
  def partial_include? search
    self.each do |e|
      return true if search.include?(e.to_s)
    end
    return false
  end
end


如果您不介意MonkeyPatch数组类,可以这样做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
test = ["i am a boy" ,"i am a girl"]

class Array
  def partial_include? search
    self.each do |e|
      return true if e[search]
    end
    return false
  end
end

p test.include?("boy") #==>false
p test.include?("frog") #==>false

p test.partial_include?("boy") #==>true
p test.partial_include?("frog") #==>false


如果要测试数组元素中是否包含单词,可以使用如下方法:

1
2
3
def included? array, word
  array.inject([]) { |sum, e| sum + e.split }.include? word
end


如果您只是在寻找一个直接匹配,那么include?已经在Ruby中提供了。从堆栈溢出的类似问题回答线程:

检查Ruby中的数组中是否存在值