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

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

问题描述:

使用PostgreSQL v.8.2.14,我试图用几个分支构建一个正则表达式,其中一些分支不区分大小写,其他分支不是。PostgreSQL正则表达式不区分大小写的部分

考虑下面的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先进,顺便说一句,当我把在正则表达式的开始,那么就没有错误(我):

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

任何帮助欣然赞赏。

(?i)(及相关选项)仅在表达式开始时有效。来自fine manual

An ARE may begin with embedded options: a sequence (?xyz) (where xyz is one or more alphabetic characters) [...]

重点是我的。 (?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 
+0

以及感谢,但是这就是我很害怕。 –

+0

......(我没有说完我的评论......)非常感谢你的回答,但这正是我所害怕的。多重正则表达式方法的问题在于它削减了正则表达式引擎通常会执行的任何回溯。例如,查看/(Foobar |(?i:bar))/,我希望它只在'Foobar'开始时匹配一次,并且在'fooBar'的第3个位置只匹配一次。由于我以编程方式构建这些正则表达式,因此我可以执行“不区分大小写”的方法。谢谢。 –