找不到在模式中否定regexp的方法

qhhrdooz  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(435)

我找不到使用regexp查找包含第一个单词和第二个单词的所有匹配项的方法,但这两个单词之间不应该是特定的单词。 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

d8tt03nd

d8tt03nd1#

在8.0之前的mysql版本中,不能使用单个正则表达式,因为它是基于posix的正则表达式,不支持lookarounds。
对于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 regex引擎,可以使用基于lookaround的regex:

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

这个 (?:(?!<p>).)*? 是一个匹配任何字符(除了换行符字符,要匹配包括换行符在内的任何字符,请添加 (?s) 在模式开始)与 . ,尽可能少的重复(由于 *? 量词),它不会启动 <p> 字符序列。

相关问题