mysql - 找不到在模式内否定正则表达式的方法
问题描述
我找不到使用正则表达式查找包含第一个单词和第二个单词但两者之间不应该是特定单词的所有匹配项的方法。
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>).)*?
是一个缓和的贪婪令牌,它匹配任何字符(除了换行符,匹配任何字符,包括换行符,(?s)
在模式开始处添加).
,尽可能少的重复(由于*?
量词),不开始<p>
字符序列。
推荐阅读
- c++ - 循环中的函数,参数不变
- sql - 是否可以根据变量的数量在 case 语句中重复 when 子句?
- python - SQL QUERY:从 MySQL 中获取多个位置,使用地理编码,然后使用 lat / long 更新记录
- ms-access - 使用预定义的选项抑制标准错误消息
- java - Intellij 构建未设置 Maven 属性
- angular - WebStorm Angular 集成不起作用
- javascript - 单击单选按钮上的文本显示
- javascript - 关闭选项卡/浏览器后调用函数
- servlets - Jetty 拆分文件服务器与标题过滤器相结合
- ios - 测试类的包返回 Xcode 10 中的主包,而不是单元测试包