两个字符串数组之间的正则表达式匹配

阿什温·雅普拉(Ashwin Yaprala)

我有两个数组

sentences_ary = ['This is foo', 'bob is cool'] 

words_ary = ['foo', 'lol', 'something']

我想检查中的任何元素是否sentences_ary匹配中的任何单词words_ary

我可以检查一项工作,但是无法完成word_ary

#This is working
['This is foo', 'bob is cool'].any? { |s| s.match(/foo/)} 

但是我无法使其与ary regex ary一起使用。我从这总是正确的:

# This is not working    
['This is foo', 'bob is cool'].any? { |s| ['foo', 'lol', 'something'].any? { |w| w.match(/s/) } }

我正在用这种if情况。

锡人

RegexpTrie对此进行了改进:

require 'regexp_trie'

sentences_ary = ['This is foo', 'This is foolish', 'bob is cool', 'foo bar', 'bar foo']
words_ary = ['foo', 'lol', 'something']

words_regex = /\b(?:#{RegexpTrie.union(words_ary, option: Regexp::IGNORECASE).source})\b/i
# => /\b(?:(?:foo|lol|something))\b/i

sentences_ary.any?{ |s| s[words_regex] } # => true
sentences_ary.find{ |s| s[words_regex] } # => "This is foo"
sentences_ary.select{ |s| s[words_regex] } # => ["This is foo", "foo bar", "bar foo"]

您必须小心如何构造正则表达式模式,否则可能会得到假阳性结果。这可能是很难追踪的错误。

sentences_ary = ['This is foo', 'This is foolish', 'bob is cool', 'foo bar', 'bar foo']
words_ary = ['foo', 'lol', 'something']
words_regex = /\b(?:#{ Regexp.union(words_ary).source })\b/ # => /\b(?:foo|lol|something)\b/
sentences_ary.any?{ |s| s[words_regex] } # => true
sentences_ary.find{ |s| s[words_regex] } # => "This is foo"
sentences_ary.select{ |s| s[words_regex] } # => ["This is foo", "foo bar", "bar foo"]

/\b(?:foo|lol|something)\b/生成模式足够聪明,可以查找单词边界,该单词边界将查找单词,而不仅仅是子字符串。

另外,请注意使用source这一点非常重要,因为缺少它会导致很难定位错误。比较这两个正则表达式:

/#{ Regexp.union(words_ary).source }/ # => /foo|lol|something/
/#{ Regexp.union(words_ary) }/        # => /(?-mix:foo|lol|something)/

注意第二个如何嵌入标记(?-mix:...)他们在周围的图案内部更改了封闭图案的标志内部模式的行为可能与周围的模式有所不同,从而导致黑洞吞噬了您意想不到的结果。

甚至Regexpunion文档也显示了这种情况,但没有提及为什么它可能很糟糕:

Regexp.union(/dogs/, /cats/i)        #=> /(?-mix:dogs)|(?i-mx:cats)/

请注意,在这种情况下,两种模式都有不同的标志。在我们的团队中,我们union经常使用,但是我总是小心翼翼地看看在同行评审中它是如何使用的。我曾经对此有所了解,很难弄清楚出什么问题了,所以我对此非常敏感。尽管union采用了模式,如示例中所示,但我建议不要使用它们,而应使用单词数组或模式作为字符串,以避免那些讨厌的标志潜入其中。他们有时间和地点,但是了解这一点可以让我们控制它们的使用时间。

多次通读Regexp文档,因为有很多东西要学习,它将使前几次学习不堪重负。

而且,要获得额外的信用,请阅读:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配两个字符之间的字符串

来自分类Dev

两个字符串之间的python正则表达式匹配

来自分类Dev

Bash正则表达式,两个字符串之间的匹配字符串

来自分类Dev

正则表达式-匹配两个字符串之间的字符串

来自分类Dev

正则表达式,以匹配其他两个字符串之间的字符串

来自分类Dev

正则表达式匹配文档中两个字符串之间的所有字符

来自分类Dev

正则表达式:匹配两个字符串之间的所有字符

来自分类Dev

正则表达式匹配和替换字符串之间的两个字符

来自分类Dev

正则表达式忽略两个字符串之间的字符?

来自分类Dev

正则表达式查找两个字符之间的字符串

来自分类Dev

正则表达式模式匹配并获得两个字符串

来自分类Dev

使用正则表达式查找两个字符串之间的所有匹配项

来自分类Dev

正则表达式,用于查找两个字符串之间的匹配项(复数)

来自分类Dev

正则表达式可在两个字符串之间找到多个匹配项

来自分类Dev

通过使用正则表达式匹配在两个字符串之间选择文本

来自分类Dev

使用正则表达式查找两个字符串之间的多个匹配项

来自分类Dev

使用正则表达式查找两个字符串之间的所有匹配项

来自分类Dev

正则表达式匹配逗号分隔、多行和两个字符串之间的单词

来自分类Dev

正则表达式匹配两个字符串之间的无限重复模式

来自分类Dev

正则表达式在两个字符串之间获取文本

来自分类Dev

两个字符串python之间的正则表达式文本

来自分类Dev

两个字符串之间的正则表达式文本

来自分类Dev

正则表达式:计算两个字符串之间的差异

来自分类Dev

多行正则表达式在两个字符串之间读取

来自分类Dev

在两个字符串(包括第一个字符串)之间匹配的正则表达式

来自分类Dev

如何在两个字符串之间使用正则表达式匹配并查找原始文件,并获取两个字符串之间的整个字符串?

来自分类Dev

正则表达式匹配两个字符串,包括那些字符串

来自分类Dev

两个字符串之间或字符串末尾的R正则表达式

来自分类Dev

使用正则表达式获取两个字符串之间的子字符串

Related 相关文章

  1. 1

    正则表达式匹配两个字符之间的字符串

  2. 2

    两个字符串之间的python正则表达式匹配

  3. 3

    Bash正则表达式,两个字符串之间的匹配字符串

  4. 4

    正则表达式-匹配两个字符串之间的字符串

  5. 5

    正则表达式,以匹配其他两个字符串之间的字符串

  6. 6

    正则表达式匹配文档中两个字符串之间的所有字符

  7. 7

    正则表达式:匹配两个字符串之间的所有字符

  8. 8

    正则表达式匹配和替换字符串之间的两个字符

  9. 9

    正则表达式忽略两个字符串之间的字符?

  10. 10

    正则表达式查找两个字符之间的字符串

  11. 11

    正则表达式模式匹配并获得两个字符串

  12. 12

    使用正则表达式查找两个字符串之间的所有匹配项

  13. 13

    正则表达式,用于查找两个字符串之间的匹配项(复数)

  14. 14

    正则表达式可在两个字符串之间找到多个匹配项

  15. 15

    通过使用正则表达式匹配在两个字符串之间选择文本

  16. 16

    使用正则表达式查找两个字符串之间的多个匹配项

  17. 17

    使用正则表达式查找两个字符串之间的所有匹配项

  18. 18

    正则表达式匹配逗号分隔、多行和两个字符串之间的单词

  19. 19

    正则表达式匹配两个字符串之间的无限重复模式

  20. 20

    正则表达式在两个字符串之间获取文本

  21. 21

    两个字符串python之间的正则表达式文本

  22. 22

    两个字符串之间的正则表达式文本

  23. 23

    正则表达式:计算两个字符串之间的差异

  24. 24

    多行正则表达式在两个字符串之间读取

  25. 25

    在两个字符串(包括第一个字符串)之间匹配的正则表达式

  26. 26

    如何在两个字符串之间使用正则表达式匹配并查找原始文件,并获取两个字符串之间的整个字符串?

  27. 27

    正则表达式匹配两个字符串,包括那些字符串

  28. 28

    两个字符串之间或字符串末尾的R正则表达式

  29. 29

    使用正则表达式获取两个字符串之间的子字符串

热门标签

归档