2013-06-15 5 views

ответ

1

AFAIK эта функция недоступна в PostgreSQL. This answer, похоже, согласен. Это 3-х лет, поэтому с тех пор что-то изменилось, но если это так, я не знаю об этом.

Из оригинального плаката:

PostgreSQL не поддерживает классы символов, основанные на базе данных символов Unicode, как .NET делает. Вы получаете более стандартный стандарт [[: alpha:]], но это зависит от языка и, вероятно, не будет его покрывать.

Возможно, вам удастся просто замаскировать символы ASCII, которые вы не хотите, и разрешить все символы, отличные от ASCII. например, что-то вроде

[^\s!"#$%&'()*+,\-./:;<=>?\[\\\]^_`~]+ 

(JavaScript не имеет классов символов не-ASCII либо или даже [[: альфа:]].).

Например, при v_text в качестве текстовой переменной быть sanitzed :

-- Allow internationalized text characters and remove undesired characters 
v_text = regexp_replace(lower(trim(v_text)), '[!"#$%&()*+,./:;<=>?\[\\\]\^_\|~]+' 

EDIT: Обратите внимание @depesz ответ ниже. Можно получить классы символов и [[:upper:]], работающие над Postgres в Linux, поскольку реализация ctype Linux (по-видимому) основана на UTF-8. Я не уверен, что это конфигурация «из коробки» или какой-то апгрейд, но хорошо знать, что это возможно.

+1

Поддержка регулярного выражения Unicode значительно улучшилась в 9.1 (я думаю) - но я не думаю, что были добавлены расширенные классы, подобные тем, на которые вы ссылаетесь. Pg в основном использует поддержку операционной системы для кодировок и локалей, что в некоторой степени зависит от прихотей поставщиков ОС. –

+0

«Поддержка регулярного выражения Unicode значительно улучшилась в 9.1 (я думаю)» - отлично знать! Однако мой опыт работы с локалями и т. Д. Был таким же, как вы описываете. В какой-то момент было бы здорово, если бы это изменилось, но трудно было жаловаться на качество отличного программного обеспечения, такого как PostgreSQL. :) – sigpwned

+1

. Большой элемент списка пожеланий для PostgreSQL - это преобразование языка и кодирования для использования библиотеки ICU (http://ICU-project.org). Это будет огромная работа, и есть некоторые проблемы с производительностью, но она избавится от какого-то нехорошего поведения на локальном уровне платформы (разломанные коллажи для Mac OS X для многих локалей, разные имена языков в Windows и т. Д.). –

0

Почему вы не используете обычные классы - [: lower:] и [: upper:]? Проверьте это:

$ select w, w ~ '^[[:lower:][:upper:]]+$' from (values ('aBc'::text), ('żÓŁW'), ('123')) as x (w); 
    w | ?column? 
------+---------- 
aBc | t 
żÓŁW | t 
123 | f 
(3 rows) 
+0

Вы пробовали регулярное выражение OP, чтобы узнать, работает ли оно в вашей системе? В PostgreSQL большая часть поведения локали (на котором работает механизм регулярных выражений) обрабатывается уровнем ОС. Я был бы удивлен, если бы работали классы [[: lower:]] и '[[: upper:]]' named character, а '[p {L}]' did not. По этой причине я подозреваю, что в вашей системе эти классы символов работают, потому что ваша ОС обрабатывает эти классы символов разумным образом, поэтому '[p {L}]' будет работать.Если это так, это решение не будет работать для OP, если только он не может переключиться на платформу, на которой вы стоите (или, например, на нее). – sigpwned

+0

Зачем это нужно? Регулярные выражения PostgreSQL не содержат ничего подобного [p {...}]. Не уверен, где он нашел такой синтаксис, но ни perl, ни Pg не поддерживают что-то вроде этого. Или, если быть точным - это так. [p {L}] - это простой диапазон символов с 4 символами: p, {, L и}. –

+0

Derp. Ты прав. Однако в [Postgres documentation] (http://www.postgresql.org/docs/9.3/static/functions-matching.html): «Эти [стандартные классы символов] обозначают классы символов, определенные в ctype. предоставить другим ». Подход (хороший!), Который вы указали, по-прежнему является платформой (то есть реализацией 'ctype'). На какой платформе вы находитесь, где это регулярное выражение Postgres дает такое поведение? Эта информация может быть полезна для ОП. – sigpwned

1

я написал расширение, которое объединяет PCRE в PostgreSQL: https://github.com/petere/pgpcre. Он лучше поддерживает свойства Unicode. Вы можете написать что-то вроде

title ~ pcre '^\p{L}' 
Смежные вопросы