带单词边界的正则表达式并集

Regexp union with word boundaries

我有一个模式列表,我想将一个字符串与这些模式匹配,但我只需要匹配整个单词,所以我一直在寻找一种将单词边界动态插入 Regexp.union 方法的方法但我错过了一些东西。 这是我试过的

test_string = "lonewolf is lonely"
pattern_list = ["lonely", "wolf", "jungle"]
pattern_list.collect! { |pattern| pattern = "\b" + pattern + "\b"}
patterncollection = Regexp.union(pattern_list)
puts patterncollection
puts test_string.scan(patterncollection)

结果为空,如果我打印模式集合,我发现“\b”没有正确转义。 我不能直接在数组中插入“\b”,因为该列表是动态检索的。 我尝试了不止一种选择,但仍然没有运气。 欢迎不同的方法来解决这个问题。

最简单的解决方案是将词边界匹配器移到并集之外:

/\b(#{Regexp.union(pattern_list).source})\b/

▶ "lonewolf is lonely".scan /\b(#{Regexp.union(%w|lonely wolf jungle|).source})\b/
#⇒ [
#    [0] [
#        [0] "lonely"
#    ]
#  ]

请同时参考下面的重要评论。基本上,它建议“除非你绝对肯定你知道会发生什么,否则使用源代码。 – 铁皮人。

我相应地更新了答案。