我有一个字符串数组a
,我想检查另一个长字符串b
是否包含数组中的任何字符串
a = ['key','words','to', 'check']
b = "this is a long string"
我有什么不同的选择来实现这个目标?
例如,这似乎有效
not a.select { |x| b.include? x }.empty?
但它会返回否定回复,这就是为什么我有not
,其他任何想法或不同的方式?
答案 0 :(得分:11)
您可以使用#any?。
a = ['key','words','to', 'check']
b = "this is a long string"
a.any? { |s| b.include? s }
或者使用::union
之类的东西。但是根据需要,您可能需要更改正则表达式,在某种程度上可以完成。如果没有,那么我将使用上面一个。
a = ['key','words','to', 'check']
Regexp.union a
# => /key|words|to|check/
b = "this is a long string"
Regexp.union(a) === b # => false
答案 1 :(得分:0)
您也可以使用数组交集(#&)方法:
a = ['key','words','to', 'check']
b = "this is a long string"
shared = a & b.gsub(/[.!?,'"]/, "").split(/\s/)
哪个会返回一个包含所有共享字符的数组。
答案 2 :(得分:0)
有很多方法可以做你想做的事情,但我喜欢为了清晰的目的而编程,即使它有点冗长。最适合我的方法是扫描数组中每个成员的字符串,然后查看展平结果是否有任何成员。例如:
a = ['key','words','to', 'check']
b = "this is a long string"
a.map { |word| b.scan /#{word}/ }.flatten.any?
# => false
a << 'string'
a.map { |word| b.scan /#{word}/ }.flatten.any?
# => true
这可行的原因是scan返回一系列匹配项,例如:
=> [[], [], [], [], ["string"]]
Array#flatten可确保删除空的嵌套数组,以便Enumerable#any?的行为符合您的预期。要了解您需要#flatten的原因,请考虑以下事项:
[[], [], [], []].any?
# => true
[[], [], [], []].flatten.any?
# => false