MySQL REGEXP中的负反向引用

Jus*_*tin 3 regex mysql backreference

MySQL手册不是很详细,它支持哪些表达式,所以我不确定MySQL是否可以使用以下内容.

我正在尝试使用与以下内容匹配的RLIKE创建查询.

任务是从SQL中获取包含给定句子中至少任意两个单词的所有句子.

比方说,我在正则表达式中使用了一些单词:

hello, dog
Run Code Online (Sandbox Code Playgroud)

我在数据库中有以下句子:

hello from dog
hello hello cat
dog says hello
dog dog goes away
big bad dog
Run Code Online (Sandbox Code Playgroud)

从那些我想要匹配的东西

hello from dog
dog says hello
Run Code Online (Sandbox Code Playgroud)

现在我有这样的:

SELECT *
FROM test
WHERE 
test RLIKE '(hello|dog).*(hello|dog)'
Run Code Online (Sandbox Code Playgroud)

问题是 - 我也得到那些不需要的东西

hello hello cat
dog dog goes away
Run Code Online (Sandbox Code Playgroud)

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

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

RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)'
Run Code Online (Sandbox Code Playgroud)

所以它可能像:

'(hello|dog).*(negative backreference to the 1st group goes here)(hello|dog)'
Run Code Online (Sandbox Code Playgroud)

可以在MySQL正则表达式中进行这种负面反向引用吗?或者也许有一些更好的方法来编写正则表达式做同样的事情,但也考虑到查询将由某些C++代码生成,所以它不应该太复杂生成?

Tim*_*ker 5

MySQL使用Posix扩展正则表达式引擎(POSIX ERE),因此根本不支持反向引用.它也不支持为了构造可以处理它的单个正则表达式所需的外观.

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

hello.*dog|dog.*hello
Run Code Online (Sandbox Code Playgroud)

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