2014-01-23 2 views
2

У меня есть следующий запрос:Что эквивалентно regexp Q ... E в postgresql?

SELECT 
    field 
FROM 
    myTable 
WHERE 
    field ~ '\\Qprefix[\\E.+' 

Он не найдет значения, как prefix[foo].

Как заменить \Q..\E?

+1

Что именно '\ Q' делать? –

+0

@a_horse_with_no_name _ «Многие вкусы также поддерживают escape-последовательность' \ Q ... \ E'. Все символы между '\ Q' и' \ E' интерпретируются как буквенные символы. "_ Http: //www.regular -expressions.info/characters.html – Wiseguy

+1

вы можете использовать «Metasyntax регулярного выражения». Обычно вкус используемого RE определяется regex_flavor. Однако это может быть переопределено префиксом директора. Если RE начинается с ***:, остальная часть RE берется как ARE независимо от regex_flavor. Если RE начинается с *** =, остальная часть RE принимается за литеральную строку, причем все символы считаются обычными символами. См. Http://www.postgresql.org/docs/8.3/static/functions-matching.html –

ответ

1

Эта форму регулярного выражения с \Q..\E неупорядоченная подстрока поддерживается только PCRE, которая изначально недоступна в PostgreSQL.

Если ваша программа должна иметь дело с этим синтаксисом в целом, поддержка PCRE может быть установлен как расширение, как это предусмотрено здесь: https://github.com/petere/pgpcre

С другой стороны, если это только то, что один регулярное выражение, которое должно быть сделано, чтобы работа, первая Обратите внимание, что двойная обратная косая черта в '\\Qprefix[\\E.+' означает буквально две обратные косые черты с PostgreSQL 9.1 и выше, если только standard_conforming_strings явно не переключен на OFF. Чтобы нечувствительность к этой настройке, ожидается, что литералы со старым синтаксисом будут иметь префикс E. Это описано в документе String Constants with C-style Escapes в документе.

Чтобы просто соответствовать prefix[foo] с PostgreSQL в стиле регулярных выражений с современным синтаксисом, это работает:

test=> show standard_conforming_strings ; 
standard_conforming_strings 
----------------------------- 
on 
(1 row) 

test=> select 'prefix[foo]' ~ 'prefix\[.+'; 
?column? 
---------- 
t 
(1 row) 
Смежные вопросы