PostgreSQL正则表达式字符类元素顺序影响匹配的原因及文档说明问询
PostgreSQL SIMILAR TO正则字符类匹配异常原因解析
问题根源:连字符在字符类中的特殊解析规则
在SIMILAR TO的字符类([])语法里,连字符(-)默认是范围运算符(比如a-z表示匹配a到z的所有字母)。只有当它出现在字符类的开头或结尾时,才会被当作普通字符处理。
你写的无效表达式[[:alnum:]._-]里,._-的位置导致连字符被当成了范围运算符:
ASCII编码中,.的码值是46,-是45,._-会被解析为“从.到-的字符范围”——但这个范围是无效的(因为起始码值大于结束码值),所以这部分不会匹配任何字符。整个字符类实际只有[:alnum:]生效,自然匹配不到_、.和-。
而有效表达式[-_.[:alnum:]]把连字符放在了字符类的最开头,此时它被视为普通字符,-、_、.都被加入匹配集合,再结合[:alnum:],就能正确匹配所有需要的字符。
官方文档说明
PostgreSQL官方文档明确记录了这一规则:在SIMILAR TO的字符类中,若要将连字符作为普通字符匹配,必须将其放在字符类的开头、结尾,或者使用反斜杠转义(需注意SQL语境下的转义规则)。同时,SIMILAR TO遵循SQL标准的正则语法,这一行为也符合SQL标准的定义。
内容的提问来源于stack exchange,提问作者Kevin Holway
相关产品推荐
相关产品推荐

