PostgreSQL中用regexp_replace/replace无法移除所有空白字符的问题
解决PostgreSQL中特殊空白字符无法替换的问题
那个无法被普通空格替换的字符大概率是非断空格(NBSP,Unicode编码U+00A0)——这类字符常见于复制粘贴的文本(比如网页、办公文档),外观和普通空格一致,但编码不同,普通的replace或\s正则规则无法匹配。
步骤1:确认字符的Unicode编码
先提取那个特殊字符并查看其编码,执行以下SQL:
-- 替换成你的变量名或实际字符串 SELECT unicode(substring('Snímek obrazovky 2019-12-05 v 13.33.37.png' from position('v' in 'Snímek obrazovky 2019-12-05 v 13.33.37.png')+1 for 1));
如果返回结果是160,即可确定是NBSP。
步骤2:针对性替换
方法1:同时替换普通空格和NBSP
用嵌套的replace函数一次性处理两种空格:
SELECT replace(replace(your_variable, ' ', '_'), U&'\00A0', '_');
U&'\00A0'是PostgreSQL中表示Unicode字符的标准写法。
方法2:用正则匹配所有Unicode水平空白字符
使用Unicode正则类\p{Blank}匹配所有水平空白字符(包括普通空格、NBSP等):
SELECT regexp_replace(your_variable, '\p{Blank}', '_', 'g');
如果需要覆盖换行、制表符等所有空白类型,可以用\p{Space}替代\p{Blank}。
方法3:用translate批量替换
translate函数可一次性映射多个字符到目标字符,写法更简洁:
SELECT translate(your_variable, ' ' || U&'\00A0', '__');
内容的提问来源于stack exchange,提问作者Macejkou
相关产品推荐
相关产品推荐

