Postgres正则表达式符号匹配问题:校验邮箱非法字符时报错
解决PostgreSQL中SIMILAR TO正则表达式报错的问题
这个报错ERROR: invalid regular expression: quantifier operand invalid是因为你的正则表达式里有未正确转义的量词元字符,比如+、*、?——这些在SIMILAR TO语法里是特殊量词符号,直接写会被解析为正则规则,而不是你要匹配的字面字符。另外你表达式里的&是HTML转义字符,在SQL语句里应该直接写&。
修正后的SIMILAR TO语句
把需要匹配的字面量词和特殊字符转义后,正确的语句应该是:
var_EmailAddress NOT SIMILAR TO '%( &|,|"|#|:|;|%|$|^|~|!|`|\?|<|>|\+|=|\\|/|\*)%'
我做了这些关键调整:
- 将
&替换为&(SQL中不需要HTML转义,直接写原字符即可) - 给
+、*、?加上反斜杠转义(\+、\*、\?),让PostgreSQL把它们当作普通字符匹配 - 把
\转义为\\(SQL字符串里需要双反斜杠来表示一个字面反斜杠)
更简洁的替代方案:使用POSIX正则操作符!~
PostgreSQL里更常用也更直观的正则匹配是用~(匹配)和!~(不匹配)操作符,用字符类来简化你的规则,这样不需要转义这么多字符:
var_EmailAddress !~ '[ &,"#:;%$^~!`?<>+=\\/*]'
这个语句的逻辑和你原来的需求完全一致:只要邮箱地址不包含方括号里的任何非法字符,就返回true。字符类里的大部分特殊字符不需要额外转义,只需要把\写成\\即可。
内容的提问来源于stack exchange,提问作者chandrashekar
相关产品推荐
相关产品推荐

