mysql - 无法找到一种方法来否定模式内的正则表达式

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

最佳答案

在 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) 匹配的任何字符(除换行符字符外,要匹配包括换行符在内的任何字符,请在模式开头添加 .) , 尽可能少的重复(由于 *? 量词),这不会启动 <p>字符序列。

关于mysql - 无法找到一种方法来否定模式内的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487606/

相关文章:

regex - 关于 Kleene 星的困惑

regex - 匹配两个标记内任意位置的单词,由空格或标记分隔

php - 从数据库获取查询 - Codeigniter

java - MySQL使用Statement.RETURN_GENERATED_KEYS时出错

mysql - 数据库计数和分组错误

来自本地主机的远程服务器中数据库的 mysqldump

javascript - 正则表达式 - 获取引号之间的字符

mysql: if then else 查询

regex - 如何使用 Zeus 重写规则从 URL 路径获取最后一个目录?

java - 替换两个字符串之间的字符串