首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何同时匹配多个正则表达式的线条?

如何同时匹配多个正则表达式的线条?
EN

Stack Overflow用户
提问于 2014-06-11 00:40:35
回答 3查看 95关注 0票数 1

我有一个数组,其中包含标签,通常是简单的英文单词,大约3-6元素.我必须从包含所有标签的文本文件中选择行(小写或大写不算,大小写不敏感)。我如何在Ruby中实现这一点?我应该使用regex还是任何不同的方法?

例如,我知道如何逻辑或regex模式/tag1 \xtag2\ to 3/是否有可能以任何方式逻辑和它们?/tag1& tag2 & tag3/?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-11 01:45:42

这是你能做到的一种方法。

代码语言:javascript
运行
复制
def line_contains_tags(str, tags)
    str.scan(/(?:^|\s)(#{tags.join('|')})(?=\s|$)/)
       .flatten(1)
       .uniq.size == tags.size
end

示例

代码语言:javascript
运行
复制
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的元素,其前面是字符串或空格字符的开头,后面是由空格字符或字符串末尾组成的零长度(正向前查找)字符串。

代码语言:javascript
运行
复制
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

最后一个例子,

代码语言:javascript
运行
复制
str = "tag1 tag1 tag3"
a = str.scan(r).flatten(1).uniq #=> ["tag1", "tag3"]
a.size == 3                     #=> false
票数 1
EN

Stack Overflow用户

发布于 2014-06-11 00:44:02

是。To和标记,在字符串锚点^开始后使用查找头。

代码语言:javascript
运行
复制
^(?=.*tag1)(?=.*tag2)(?=.*tag3).*

您可以通过遍历数组来编程地组装这个regex。

票数 5
EN

Stack Overflow用户

发布于 2014-06-11 03:19:53

一种非正则化方法是:

代码语言:javascript
运行
复制
tags.all? {|tag| string.include? tag}

对于不区分大小写的情况,假设string是一条下线。标签已经被降级了。

正则表达式更灵活;它们可以配置为在单词边界上匹配,等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24153010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档