PostgreSQL正则表达式,不区分大小写

时间:2011-09-28 22:35:45

标签: regex postgresql case-insensitive

使用PostgreSQL v.8.2.14,我正在尝试构建一个包含多个分支的正则表达式,其中一些分支不区分大小写,其他分支不大。

考虑以下perl one-liner:

% 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)放在regexp的最开头时BTW,然后没有错误:

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

任何帮助都很高兴。

1 个答案:

答案 0 :(得分:5)

(?i)(和相关选项)仅在表达式的开头有效。来自fine manual

  

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