Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 是否删除PostgreSQL中的所有Unicode空格分隔符?_Regex_Postgresql_Unicode_Trim_Removing Whitespace - Fatal编程技术网

Regex 是否删除PostgreSQL中的所有Unicode空格分隔符?

Regex 是否删除PostgreSQL中的所有Unicode空格分隔符?,regex,postgresql,unicode,trim,removing-whitespace,Regex,Postgresql,Unicode,Trim,Removing Whitespace,我想修剪一列,并将任何多个空格和Unicode空格分隔符替换为单个空格。背后的想法是对用户名进行清理,防止两个用户使用欺骗性的名称foo bar SPACE u+20和foo barNO BREAK SPACE u+A0 到目前为止,我一直使用SELECT regexp_replaceTRIM'some string'、'[\s\v]+'、''g';它删除了空格、制表符和回车符,但不支持 我本来会添加到regexp\h,但PostgreSQL也不支持它\p{Zs}: 选择regexp_repla

我想修剪一列,并将任何多个空格和Unicode空格分隔符替换为单个空格。背后的想法是对用户名进行清理,防止两个用户使用欺骗性的名称foo bar SPACE u+20和foo barNO BREAK SPACE u+A0

到目前为止,我一直使用SELECT regexp_replaceTRIM'some string'、'[\s\v]+'、''g';它删除了空格、制表符和回车符,但不支持

我本来会添加到regexp\h,但PostgreSQL也不支持它\p{Zs}:

选择regexp_replaceTRIM'some string'、'[\s\v\h]+'、''g'; 查询7中的错误:错误:无效的正则表达式:无效的转义\序列 我们正在Debian 10 docker容器中运行PostgreSQL 12.2-2.pgdg100+1,使用UTF-8编码,并支持用户名中的emojis


有没有办法实现类似的功能?

您可以构造一个括号表达式,其中包含+选项卡中的空格字符:


它将用规则空格字符替换支持它的其他正则表达式样式中\h匹配的一个或多个水平空格的所有匹配项。

基于Postgres正则表达式、空格、某些类似空格的格式字符中的Posix空格字符类,另外一些非打印字符最终从Wiktor的帖子中又添加了两个,我浓缩了这个自定义字符类:

'[\s\u00a0\u180e\u2007\u200b-\u200f\u202f\u2060\ufeff]'
因此,请使用:

SELECT trim(regexp_replace('some string', '[\s\u00a0\u180e\u2007\u200b-\u200f\u202f\u2060\ufeff]+', ' ', 'g'));
注意:trim在regexp_replace之后出现,因此它覆盖转换的空间

重要的是要包含基本空格类\s[[:space:]的缩写,以涵盖所有当前和未来的基本空格字符

我们可以加入更多的角色。或者从剥离所有用4字节编码的字符开始。因为UNICODE是黑暗的,充满恐怖

考虑这个演示:

选择d作为十进制,选择_hexd作为十六进制,选择chrd作为图示符 ,'\u'| | lpadto_hexd,4,'0'作为unicode ,chrd~'\s'在_posix_space_类中 ,chrd~“[\s\u00a0\u180e\u2007\u200b-\u200f\u202f\u2060\ufeff]”作为自定义类 从…起 -制表符,空格,不间断空格,OGHAM空格标记,蒙古语元音,窄不间断空格 -中等数学空间、字连接符、表意空间、零宽度不间断空间 选择unnest“{9,32160576056588239828782881228865279}”:int[] 联合所有 选择generate_series 81928202作为dec-UNICODE空格 联合所有 选择generate_series 8203、8207作为dec-前5个类似空格的UNICODE格式字符 运输署 d命令; 十进制|十六进制|字形| unicode | in_posix_space|u class | in_custom|u class -----+---+-----+-----+-----------+--------- 9 | 9 | | \u0009 | t | t 32 | 20 | | \u0020 | t | t 160 | a0 | | \u00a0 | f | t 5760 | 1680 |   | \u1680 | t | t 6158 | 180e |᠎ | \u180e | f | t 8192 | 2000 |   | \u2000 | t | t 8193 | 2001 |   | \u2001 | t | t 8194 | 2002 |   | \u2002 | t | t 8195 | 2003 |   | \u2003 | t | t 8196 | 2004 |   | \u2004 | t | t 8197 | 2005 |   | \u2005 | t | t 8198 | 2006 |   | \u2006 | t | t 8199 | 2007 |   | \u2007 | f | t 8200 | 2008 |   | \u2008 | t | t 8201 | 2009 |   | \u2009 | t | t 8202 | 200a |  | \u200a | t | t 8203 | 200b |​ | \u200b | f | t 8204 | 200c |‌ | \u200c | f | t 8205 | 200d |‍ | \u200d | f | t 8206 | 200e |‎ | \u200e | f | t 8207 | 200f |‏ | \u200f | f | t 8239 | 202f |  | \u202f | f | t 8287 | 205f |  | \u205f | t | t 8288 | 2060 | ⁠ | \u2060 | f | t 12288 | 3000 |   | \u3000 | t | t 65279 | feff | | ufeff | f | t 26排 用于生成角色类的工具:

'[\s\u00a0\u180e\u2007\u200b-\u200f\u202f\u2060\ufeff]'
选择“[\s'| | string_agg'\u'| | lpadto_hexd,4,'0',按d | |排序]' 从…起 选择unnest“{9,32160576056588239828782881228865279}”:int[] 联合所有 选择generate_系列81928202 联合所有 选择generate_系列8203、8207 运输署 天哪\s′;-未包含在\s中 [\s\u00a0\u180e\u2007\u200b\u200c\u200d\u200e\u200f\u202f\u2060\ufeff] 小提琴

相关,有更多解释:


假设utf8。是否允许使用3字节或更多字节编码的字符\u0020用2个字节编码,\u00A0用3个字节编码,链接中列出的其余字符是e
编码为4个字符。除非你有中文字符或类似的字符,否则你可能想修剪所有编码为4字节的字符…密切相关:似乎工作感谢。我已经尝试过类似于但仅使用\u00A0编写的东西,但被Postgres拒绝,这是我的错误@KumZ您可以在中检查所有支持的转义序列(也称为字符输入转义)。在regexp_替换后进行修剪是一个非常有用的提示!谢谢