求可匹配中文字符、ASCII字符并排除特殊字符的SQL正则表达式
满足要求的SQL正则表达式方案
最终可用的正则表达式
直接用这一行就能同时匹配中文、英文字母、数字、空格,且排除所有特殊字符:
SELECT (val::TEXT ~ '^[a-zA-Z0-9\p{Han} ]*$');
各部分作用说明
a-zA-Z0-9:覆盖大小写英文字母和阿拉伯数字\p{Han}:精准匹配所有中文字符(PostgreSQL支持Unicode属性类,这个写法比模糊的非ASCII匹配更可靠):匹配空格字符^和$:限定整个字符串都由允许的字符组成,避免出现部分内容合法但夹杂特殊字符的情况
测试示例
- 合法内容测试:
SELECT ('李四 678Xyz'::TEXT ~ '^[a-zA-Z0-9\p{Han} ]*$');→ 返回true - 特殊字符测试:
SELECT ('@%&王五'::TEXT ~ '^[a-zA-Z0-9\p{Han} ]*$');→ 返回false - 如果要禁止空字符串,把正则里的
*改成+即可:^[a-zA-Z0-9\p{Han} ]+$
之前写法的问题分析
- 你之前用的
[ !-’~¡-ÿ]包含了大量特殊字符(比如!、#、$),所以会误匹配不该允许的内容 - 另一行
^[^[:ascii:]]+$只能匹配全非ASCII的纯中文内容,没法处理中文和英文数字混合的场景
内容的提问来源于stack exchange,提问作者Hoper
相关产品推荐
相关产品推荐

