2010-11-08 114 views
3

MySQL手册对于它支持的表达式并不是非常详细,所以我不确定以下是否可以使用MySQL。MySQL中的负面反向引用REGEXP

我想创建一个与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 

所以我想,我还需要第二次前右反向引用(你好|狗)。

在伪代码它应该是这样的:

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++代码生成查询,所以它不应该太复杂,以生成?

+1

这听起来像是建立一个单词索引 - >句子映射(然后简单地查询索引)的东西。 – Amber 2010-11-08 09:04:36

+1

或'(hello。* dog | dog。* hello)'?如果总是只有两个单词,那么 – Konerak 2010-11-08 09:05:56

+0

(hello。* dog | dog。* hello)会很棒,但也可能会有更多,然后我必须自己创建所有可能的单词组合。 – JustAMartin 2010-11-08 09:50:37

回答

5

MySQL uses a Posix Extended Regular Expression enginePOSIX ERE),因此根本不支持反向引用。它也不支持你想要构造一个可以处理这个问题的单个正则表达式。

因此,你必须拼写出所有可能的组合:

hello.*dog|dog.*hello 

当然,这将让笨拙如果匹配的候选人数量的增加,因此正则表达式是不是该在MySQL正确的工具,除非你可以安装/使用LIB_MYSQLUDF_PREG