如何编写MySQL REGEXP查询忽略句子末尾句号实现匹配
问题原因
你当前的正则仅允许关键词jesus wept后紧跟空格或直接到文本末尾,而实际存储的经文句尾关键词后带有句号,无法匹配规则所以返回空结果。
修改方案
调整正则表达式,在关键词末尾增加可选的句号匹配逻辑即可,修改后的完整查询如下:
SELECT DISTINCT vm.volume_name,vm.recno AS vmid,bk.book_name ,bk.recno AS bid,vs.recno,vs.chapter,vs.verse,vs.text FROM verses vs LEFT JOIN books bk ON bk.recno=vs.book LEFT JOIN volumes vm ON bk.volumeid=vm.recno WHERE vs.text regexp "(^|[[:space:]])jesus wept\\.?([[:space:]]|$)" AND vm.recno IN(1,3,4,5)
规则说明
新增的\\.?逻辑:
\\.转义匹配句号字符?限定前面的句号仅匹配0次或1次,也就是允许关键词末尾带或者不带句号- 保留了原有前后边界校验逻辑,不会匹配到包含关键词的更长单词
可选优化
如果需要适配用户大小写混用的搜索场景(比如用户输入Jesus Wept也能命中),可以改用大小写不敏感的匹配函数,以MySQL为例可以调整WHERE条件为:
WHERE REGEXP_LIKE(vs.text, "(^|[[:space:]])jesus wept\\.?([[:space:]]|$)", 'i')
内容的提问来源于stack exchange,提问作者Jeff Forrester
相关产品推荐
相关产品推荐

