这是您可以做到的一种方式。
代码
def line_contains_tags(str, tags)
str.scan(/(?:^|\s)(#{tags.join('|')})(?=\s|$)/)
.flatten(1)
.uniq.size == tags.size
end
示例
tags = %w{tag1 tag2 tag3}
line_contains_tags("tag1 tag2 tag3", tags) #=> true
line_contains_tags("tag2 tag1 tag3", tags) #=> true
line_contains_tags("tag1 tag3" , tags) #=> false
line_contains_tags("tag1 tag1 tag3", tags) #=> false
说明
正则表达式扫描tags 的每个元素的字符串,直到找到匹配项或断定没有匹配项。匹配是tags 的元素,前面是字符串的开头或空白字符,后面是由空白字符或字符串结尾组成的零长度(正向前瞻)字符串。
tags = %w{tag1 tag2 tag3}
#=> ["tag1", "tag2", "tag3"]
regex = /(?:^|\s)(#{tags.join('|')})(?=\s|$)/
#=> /(?:^|\s)(tag1|tag2|tag3)(?=\s|$)/
str = "tag1 tag2 tag3"
a = str.scan(regex) #=> [["tag1"], ["tag2"], ["tag3"]]
b = a.flatten(1).uniq #=> ["tag1", "tag2", "tag3"]
b.size == 3 #=> true
对于最后一个例子,
str = "tag1 tag1 tag3"
a = str.scan(r).flatten(1).uniq #=> ["tag1", "tag3"]
a.size == 3 #=> false