MySQL 手册并没有详细说明它支持什么表达式,所以我不确定以下内容是否适用于 MySQL。
我正在尝试使用与以下匹配的 RLIKE 创建查询。
任务是从 SQL 中获取所有至少包含给定句子中任意两个单词的句子。
比方说,我要在正则表达式中使用一些特定的词:
hello, dog
我在数据库中有以下句子:
hello from dog
hello hello cat
dog says hello
dog dog goes away
big bad dog
只从那些我想匹配的
hello from dog
dog says hello
现在我是这样的:
SELECT *
FROM test
WHERE
test RLIKE '(hello|dog).*(hello|dog)'
问题是——我也得到了那些不需要的
hello hello cat
dog dog goes away
所以我想,我需要在第二个 (hello|dog) 之前有一个反向引用。
在伪代码中它看起来像这样:
RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)'
所以它可能是这样的:
'(hello|dog).*(negative backreference to the 1st group goes here)(hello|dog)'
这样的负反向引用可以在 MySQL 正则表达式中完成吗? 或者也许有一些更好的方法来编写执行相同操作的正则表达式,但还要考虑到查询将由某些 C++ 代码生成,因此生成起来应该不会太复杂?
最佳答案
MySQL uses a Posix Extended Regular Expression engine ( POSIX ERE ) 因此根本不支持反向引用。它也不支持环视,您需要环视来构建可以处理此问题的单个正则表达式。
因此你必须拼出所有可能的组合:
hello.*dog|dog.*hello
当然,如果匹配候选的数量增加,这将变得笨拙,因此正则表达式不是 MySQL 中的正确工具,除非您可以安装/使用 LIB_MYSQLUDF_PREG .
关于mysql - MySQL REGEXP 中的负反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4122393/