Redshift替换特殊Unicode字符:无法移除U202C及过滤非字母数字方法
问题1:移除特殊字符\u202C不生效的排查结果
Redshift的regexp_replace函数默认使用POSIX正则语法,不支持直接识别\uXXXX格式的Unicode码点表示,你写的[\u202C]会被解析为普通字符\、u、2、0、2、C的匹配集合,自然无法匹配到U+202C这个不可见控制字符。
正确写法是通过CHR函数生成对应Unicode字符再匹配,U+202C的十进制码值为8236,修改后SQL如下:
SELECT regexp_replace('race', CHR(8236)), len(regexp_replace('race', CHR(8236)))
执行后可以看到返回字符串长度为4,说明控制字符已被成功移除。
问题2:通用过滤所有非字母、非数字字符的方案
直接使用POSIX字符类[:alnum:]匹配所有字母、数字,反向匹配所有非字母数字字符替换为空即可,语法如下:
-- 替换<目标字段>为你要处理的字段名,<表名>替换为实际表名 SELECT regexp_replace(<目标字段>, '[^[:alnum:]]', '') AS cleaned_str FROM <表名>;
如果需要额外保留指定字符(如下划线、横线等),直接在中括号内补充对应字符即可,例如下方写法会额外保留下划线:
SELECT regexp_replace(<目标字段>, '[^[:alnum:]_]', '') AS cleaned_str FROM <表名>;
内容的提问来源于stack exchange,提问作者Andrew B
相关产品推荐
相关产品推荐

