строковые функции Postgres (включая regexp_ *) рассматривают табуляцию как пробелы? - PullRequest
0 голосов
/ 19 декабря 2018

Я запускаю некоторый SQL на Postgres Server 9.5

поле, полученное иногда, имеет начальные пробелы, в том числе буквенные пробелы, и пробелы табуляции '\ t'

во многих языках программирования.легко сделать с помощью замены регулярного выражения, например, в 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 \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 простая функция, позволяющая убирать все виды пробелов, в начале, в середине и в конце строки?

EDIT:Моя жалоба также касается документации PostgreSQL, они упоминают от \t до [:space:], но на самом деле это не все виды пробелов, как знают большинство программистов, они упоминают регулярное выражение POSIX, но на самом деле не POSIX,

кто-нибудь знает лучшее место, чтобы подать им ошибку?

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

РЕДАКТИРОВАТЬ: вот документация JavaScript Mozilla, что означает \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 голосов
/ 19 декабря 2018

Да, функции регулярного выражения Postgres рассматривают табуляцию как пробел.На самом деле текст '\tafsdfwef' содержит , а не содержит символ табуляции.Вы должны написать букву E (верхний или нижний регистр) непосредственно перед открывающей одинарной кавычкой, чтобы получить в ней символ табуляции (и / или другие escape chars):

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

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

Readо строковых константах в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...