mysql - 匹配包含多个单词的正则表达式
问题描述
我应该在 MySQL 中使用什么方法将两个或多个字符串与一列匹配?
我有一列string
包含关键字,例如apple
,orange
和lemon
。我需要的是搜索包含apple
并orange
使用正则表达式的行,该命令具有以下内容:
where string regexp '(apple|orange)' and fruit = 1
上面的命令将打破规则,如果有fruit的行1
只有apple
它不应该包含在结果中,因为fruit1
没有另一行包含orange
。
解决方案
如果您想在(且仅当)string
同时包含“apple”和“orange”时成功,那么最好的方法是FULLTEXT(string)
WHERE MATCH(string) AGAINST("+apple +orange" IN BOOLEAN MODE)
这也将匹配“橙色苹果”和其他一些变体。Fulltext 有一些注意事项,例如只处理“单词”而不处理短单词。但是如果限制没问题,这将比LIKE
or快得多REGEXP
。
如果全文不起作用,那么最好是这样的:
WHERE string LIKE '%apple%'
AND string LIKE '%orange%'
或者可以通过以下方式完成REGEXP
:
WHERE string REGEXP '(apple.*orange)|(orange.*apple)'
如果您需要遵守单词边界和/或允许复数,请将其添加到您的规范中;这些建议的解决方案可能需要改变。例如,更改.*
为.+
将拒绝“appleorange”,同时仍允许“apple/orange”。
推荐阅读
- c - 如何在 Double 中检查浮点精度
- mongodb - 如何从文档中的集合中聚合数据
- c# - 测试“是”的否定是什么?
- amazon-web-services - 为什么只有 root 用户可以从 EC2 实例上传到运行 Java 程序的 S3 存储桶?
- java - 我创建 Google PULL 队列有什么问题?
- c - 在执行 procprob 时,b 可以是任何数据类型吗?
- python-3.x - tkinter 在错误的窗口中打包
- javascript - 递归过多的原因是什么?
- html - 在图像上方插入文本
- scala - 重试 Monix 任务 - 为什么这里需要 Task.defer?