MySQL REGEXP中的负反向引用

时间:2010-11-08 08:57:52

标签: mysql regex backreference

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

所以我想,我需要在第二个(你好)之前进行反向引用。

在伪代码中,它看起来像这样:

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 个答案:

答案 0 :(得分:5)

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

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

hello.*dog|dog.*hello

当然,如果匹配候选者的数量增加,这将变得难以处理,因此正则表达式在MySQL中不是正确的工具,除非您可以安装/使用LIB_MYSQLUDF_PREG