找不到在模式内取反正则表达式的方法

时间:2018-09-24 21:25:51

标签: mysql regex

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

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

1 个答案:

答案 0 :(得分:1)

在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>).)*?是一个tempered greedy token,它与任何字符匹配(除了换行符,要匹配包括换行符的任何字符,请在模式开头添加(?s))与{{ 1}},由于.量词的缘故,重复次数越少越好,这样就不会启动*?字符序列。