我有一个数组,其中包含标签,通常是简单的英文单词,大约3-6元素.我必须从包含所有标签的文本文件中选择行(小写或大写不算,大小写不敏感)。我如何在Ruby中实现这一点?我应该使用regex还是任何不同的方法?
例如,我知道如何逻辑或regex模式/tag1 \xtag2\ to 3/是否有可能以任何方式逻辑和它们?/tag1& tag2 & tag3/?
发布于 2014-06-11 01:45:42
这是你能做到的一种方法。
码
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解释
regex扫描tags的每个元素的字符串,直到找到匹配或得出不匹配的结论为止。match是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发布于 2014-06-11 00:44:02
是。To和标记,在字符串锚点^开始后使用查找头。
^(?=.*tag1)(?=.*tag2)(?=.*tag3).*您可以通过遍历数组来编程地组装这个regex。
发布于 2014-06-11 03:19:53
一种非正则化方法是:
tags.all? {|tag| string.include? tag}对于不区分大小写的情况,假设string是一条下线。标签已经被降级了。
正则表达式更灵活;它们可以配置为在单词边界上匹配,等等。
https://stackoverflow.com/questions/24153010
复制相似问题