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 ++代码生成,所以生成它不应该太复杂?
答案 0 :(得分:5)
MySQL uses a Posix Extended Regular Expression engine(POSIX ERE),因此根本不支持反向引用。它也不支持构造可以处理此问题的单个正则表达式所需的外观。
因此,您必须拼出所有可能的组合:
hello.*dog|dog.*hello
当然,如果匹配候选者的数量增加,这将变得难以处理,因此正则表达式在MySQL中不是正确的工具,除非您可以安装/使用LIB_MYSQLUDF_PREG。