首页 > 解决方案 > 匹配正则表达式中的确切短语和单词

问题描述

我正在拆分搜索结果字符串,以便可以使用Rails Highlight突出显示这些术语。在某些情况下,在同一个搜索词中会有完全匹配单个单词,我正在尝试编写一次通过的正则表达式。

search_term = 'pizza cheese "ham and pineapple" pepperoni'

search_term.split(/\W+/)
=> ["pizza", "cheese", "ham", "and", "pineapple", "pepperoni"]

search_term.split(/(?=\")\W+/)
=> ["pizza cheese ", "ham and pineapple", "pepperoni"]

我可以ham and pineapple自己获取(没有不需要的引号),并且可以轻松拆分所有单词,但是是否有一些正则表达式会返回一个数组,例如:

search_term.split(‍♂️)
=> ["pizza", "cheese", "ham and pineapple", "pepperoni"]

标签: rubyregex

解决方案


是的:

/"[^"]*?"|\w+/

https://regex101.com/r/fzHI4g/2

不作为拆分完成。只需将内容放在引号或单个单词中......每个都是匹配的。

£ cat pizza
pizza "a and b" pie
£ ruby -ne 'print $_.scan(/"[^"]*?"|\w+/)' pizza
["pizza", "\"a and b\"", "pie"]
£

所以...search_term.scan(/regex/)似乎返回了你想要的数组。

要排除您需要的引号:这会将引号放在环视中,断言匹配的表达式在它之前有一个引号(lookbehind),并且在它之后有一个引号(lookahead)而不是包含引号。

/(?<=")\w[^"]*?(?=")|\w+/

请注意,因为最后一个正则表达式不使用引号,所以它使用空格来确定开始和结束引号,所以" a bear"不行。这可以通过捕获组来解决,但如果这是一个问题,就像我在评论中所说的那样,我建议只修剪每个数组元素的引号并使用答案顶部的正则表达式。


推荐阅读