mysql - MySQL REGEXP 中的负反向引用

标签 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

所以我想,我需要在第二个 (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/

相关文章:

mysql - 计算最大序列长度

php - preg_replace 即使在第一次替换之后也匹配字符串中的所有匹配项

regex - 捕获组的负前瞻

SQL:如何从大型连续矩阵中选择矩形范围内的元素? **更新**

php - PDO Echo 10 值按降序排列

php - 发布类别将复选框值插入数据库

javascript - 如何从搜索中排除包含转义字符的整个单词?

python - 如何在Python中重新编译变量?

python - 正则表达式字符串替换: omit comma if backref is empty

java - 如何使用字符串替换的反向引用作为 Java 中 HashMap 的键?