如果字符串包含任何字符串数组,如何检入ruby

时间:2014-07-17 14:01:22

标签: ruby arrays string

我有一个字符串数组a,我想检查另一个长字符串b是否包含数组中的任何字符串

a = ['key','words','to', 'check']
b = "this is a long string"

我有什么不同的选择来实现这个目标?

例如,这似乎有效

not a.select { |x| b.include? x }.empty?

但它会返回否定回复,这就是为什么我有not,其他任何想法或不同的方式?

3 个答案:

答案 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