ruby - 匹配正则表达式中的确切短语和单词
问题描述
我正在拆分搜索结果字符串,以便可以使用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"]
解决方案
是的:
/"[^"]*?"|\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"
不行。这可以通过捕获组来解决,但如果这是一个问题,就像我在评论中所说的那样,我建议只修剪每个数组元素的引号并使用答案顶部的正则表达式。
推荐阅读
- reactjs - 如何在标记后面设置 InfoBox - React Google Maps
- point-cloud-library - PCL 彩色滤光片
- python - 如何对文件使用 split() 函数?
- kibana - 如何在 Kibana 中显示构成饼图切片的项目?
- javascript - 如何重新格式化对象中的数据。(我怎样才能使行成为键和其他列的值)
- talend - Talend:将字符串转换为 BigDecimal
- azure - 在 Azure Devops 上自动导出构建/发布日志
- javascript - TypeError:无法读取未定义 Node.js 的属性
- python - 如何解决运行 conda django 虚拟环境的问题?
- opencv - 如何从暗网模型中只提取少数类