MySQL正则搜索中点字符否定匹配的实现问题
MySQL正则匹配失效原因及解决方案
核心问题点
- 未转义正则元字符
.:正则语法中.默认匹配任意单个字符,你写的3.4.5.1会错误匹配3a4b5c1这类不符合编码规则的内容,无法精确匹配点分隔的产品编码。 - 遗漏了字符串末尾匹配场景:你写的
(3.4.5.1)[^\.]要求目标编码后必须跟随一个非点字符,当字段值刚好就是3.4.5.1(编码在字符串末尾,后面无任何字符)时,[^\.]没有可匹配的内容,导致整个正则匹配失败,返回空结果。
正确实现方案
使用如下正则即可覆盖需求:精确匹配3.4.5.1,同时排除后面紧跟点号的场景,同时兼容编码在字符串开头、中间、末尾的所有情况:
SELECT * FROM mytable WHERE REGEXP_LIKE(mycolumn, '3\\.4\\.5\\.1($|[^.])');
正则说明
\\.:MySQL正则中需要用双反斜杠转义特殊字符,这里表示精确匹配点号,避免被识别为元字符。($|[^.]):表示匹配两种合法情况的一种:$:目标编码刚好在字符串的末尾,后面无任何字符[^.]:目标编码后面跟随一个非点号的任意字符
如果使用的是MySQL 8.0之前的版本,没有REGEXP_LIKE函数,可以替换为REGEXP关键字:
SELECT * FROM mytable WHERE mycolumn REGEXP '3\\.4\\.5\\.1($|[^.])';
内容的提问来源于stack exchange,提问作者GBBL
相关产品推荐
相关产品推荐

