Postgres字符串函数(包括regexp_ *)是否将制表符视为空格?

时间:2018-12-19 15:40:17

标签: postgresql

我正在通过Postgres Server 9.5运行一些SQL

有时获得的字段前导空格,包括文字空白和制表符'\ t'

在许多编程语言中,使用regexp替换很容易,就像JavaScript中这样:

> '   \tafsdfwef\t  \n'.replace(/\s+/g, '')
'afsdfwef'

然后我发现PostgreSQL也具有此regexp_replace函数,并且还支持\s表示[[:space:]]

https://www.postgresql.org/docs/10/functions-matching.html#FUNCTIONS-POSIX-REGEXP

但是这个\s似乎只能识别空白' '吗?问题是此PostgreSQL regex是否支持\s来包含所有类型的空格(制表符,换行符)?

db=> SELECT regexp_replace('\tafsdfwef', '\s+', '');
 regexp_replace 
----------------
 \tafsdfwef
(1 row)

db=> SELECT regexp_matches('\tafsdfwef', '\s+');
 regexp_matches 
----------------
(0 rows)

然后我测试了trim函数是否可以识别其他空格?似乎也没有?

db=> SELECT trim('\tafsdfwef\t');
    btrim     
--------------
 \tafsdfwef\t
(1 row)

db=> SELECT trim('   \tafsdfwef\t');
    btrim     
--------------
 \tafsdfwef\t
(1 row)

db=> SELECT trim('   \tafsdfwef\t  \n   ');
      btrim       
------------------
 \tafsdfwef\t  \n
(1 row)

那么,PostgreSQL是否有一个简单的函数可以在字符串的开头,中间和结尾处去除各种空格?

编辑:我的抱怨也是针对PostgreSQL文档的,他们提到了\t[:space:],但实际上并不是所有类型的空格,正如大多数程序员所知道的那样,它提到了POSIX正则表达式,但并不是真的是POSIX,

有人知道向他们提交错误的更好地方吗?

https://www.postgresql.org/docs/10/functions-matching.html#FUNCTIONS-POSIX-REGEXP

编辑:这是Mozilla JavaScript文档,\s的含义 a single white space character, including space, tab, form feed, line feed and other Unicode spaces. Equivalent to [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

1 个答案:

答案 0 :(得分:2)

是的,Postgres regexp函数确实将制表符视为空格。实际上,文本'\tafsdfwef' 包含制表符。您必须在开头的单引号之前写字母E(大写或小写)才能在其中获得制表符char(和/或其他 escape chars):

SELECT regexp_replace(E'\ta\nb\fc\rd', '\s', '', 'g')

 regexp_replace 
----------------
 abcd
(1 row)

阅读文档中的string constants