gpt4 book ai didi

regex - 带有不区分大小写部分的 PostgreSQL 正则表达式

转载 作者:行者123 更新时间:2023-11-29 11:42:06 25 4
gpt4 key购买 nike

使用 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');

但我得到:错误:无效的正则表达式:量词操作数无效。请注意,regex_flavor 是高级的,顺便说一句,当我将 (?i) 放在正则表达式的最开头时,就没有错误:

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

关于regex - 带有不区分大小写部分的 PostgreSQL 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7590469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com