我正在通过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
答案 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。