regexp_replace的行为就像我已经给了它一个全局标志一样,但实际上我并没有这样做。

3

在PostgreSQL中使用regexp_replace,我已经开发出了一个匹配前n个字符的模式,如果最后一个字符不在我不想要的字符列表中,则不希望字符串以该字符结尾。

regexp_replace(pf.long_description, '(^.{1,150}[^ -:])', '\1...')::varchar(2000)

然而,我期望只是在字符串末尾加上省略号。但是实际得到的是前150个字符加上省略号,但是字符串继续一直到结尾。
为什么所有这些内容都没有被消除?

2个回答

3

为什么所有的内容都没有被消除?

因为您没有请求这样做。 您要求将前2-151个字符替换为相同的字符和省略号。 如果您修改模式为(^.{1,150}[^ -:]).*(注意尾随的.*使regex_replace在整个字符串上工作,而不仅仅是前缀),则应该会获得所需的效果。


1

我需要确认一下,您是否真的想要空格字符和冒号之间的字符范围:[^ -:]

如果要在字符类中包含文字 -,请将其放在首位或末位。看起来您可能实际上想要的是[^ :-] - 这只是排除了三个列出的字符。
有关手册中括号表达式的详细信息。

这应该是(基于@just已经提供的内容):

SELECT regexp_replace(pf.long_decript-ion, '(^.{1,150}[^ :-]).*$', '\1...');

但是使用substring()应该会更便宜:

SELECT substring(pf.long_decript-ion, '^.{1,150}[^ :-]') || '...';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接