PostgreSQL регулярное выражение с нечувствительными к регистру частями - PullRequest
3 голосов
/ 29 сентября 2011

Используя PostgreSQL v.8.2.14, я пытаюсь построить регулярное выражение с несколькими ветвями, некоторые из которых нечувствительны к регистру, другие нет.

Рассмотрим следующую строку perl:

% echo 'foo Foo bar Bar' | perl -pe 's/(foo|(?i:bar))/_\1/g'
_foo Foo _bar _Bar

Я думал, что доберусь с:

select regexp_replace('foo Foo bar Bar','(foo|((?i)bar)',E'_\\1','g');

Но я получаю: ERROR: invalid regular expression: quantifier operand invalid. Обратите внимание, что regex_flavor является продвинутым, и, кстати, когда я помещаю (? I) в самое начало регулярного выражения, то ошибки нет:

select regexp_replace('foo Foo bar Bar','(?i)(foo|bar)',E'_\\1','g');
 _foo _Foo _bar _Bar

Любая помощь с удовольствием приветствуется.

1 Ответ

5 голосов
/ 29 сентября 2011

(?i) (и связанные параметры) действительны только в начале выражения.Из подробного руководства :

ARE может начинаться со встроенными параметрами: последовательность (? Xyz) (где xyz - один или несколько буквенных символов)[...]

Акцент мой.Опции (?xyz) похожи на конечные опции /.../xyz в регулярных выражениях других языков.Также обратите внимание, что в руководстве по 9.0 используется один и тот же язык, поэтому вы не можете просто обновить свой путь.

Похоже, вам нужно два regexp_replace вызова:

> select regexp_replace(regexp_replace('foo Foo bar Bar', 'foo', E'_\\&', 'g'), 'bar',  E'_\\&', 'ig');
   regexp_replace   
--------------------
 _foo Foo _bar _Bar

Или выполнитерегистронезависимое сопоставление трудного пути (то есть классов символов):

> select regexp_replace('foo Foo bar Bar', '(foo|[Bb][Aa][Rr])', E'_\\1', 'g');
   regexp_replace   
--------------------
 _foo Foo _bar _Bar
...