首页 > 解决方案 > 找不到在模式内否定正则表达式的方法

问题描述

我找不到使用正则表达式查找包含第一个单词第二个单词但两者之间应该是特定单词的所有匹配项的方法。

select '<p>66-155</p><p>en application</p>' regexp '66-155.*[<,p,>]en application'

应该返回 0

select '<p>66-155 en application</p>' regexp '66-155.*[<,p,>]en application'

应该返回 1

标签: mysqlregex

解决方案


在 8.0 之前的 MySQL 版本中,您不能为此使用单个正则表达式,因为它是基于 POSIX 的正则表达式,不支持环视。

使用早期版本的 MySQL,您可以使用类似的东西

LIKE '%66-155%en application%' AND NOT LIKE '%66-155%<p>%en application%'

如果,而不是文字子字符串,你有正则表达式模式,那么它看起来像

REGEXP '66-155.*en application' AND NOT REGEXP '66-155.*<p>.*en application'

在 MySQL 8.x 中,使用 ICU 正则表达式引擎,您可以使用基于环视的正则表达式:

REGEXP '66-155(?:(?!<p>).)*?en application'

(?:(?!<p>).)*?是一个缓和的贪婪令牌,它匹配任何字符(除了换行符,匹配任何字符,包括换行符,(?s)在模式开始处添加).,尽可能少的重复(由于*?量词),不开始<p>字符序列。


推荐阅读