在PostgreSQL中使用regexp_replace
,我已经开发出了一个匹配前n个字符的模式,如果最后一个字符不在我不想要的字符列表中,则不希望字符串以该字符结尾。
regexp_replace(pf.long_description, '(^.{1,150}[^ -:])', '\1...')::varchar(2000)
然而,我期望只是在字符串末尾加上省略号。但是实际得到的是前150个字符加上省略号,但是字符串继续一直到结尾。
为什么所有这些内容都没有被消除?
在PostgreSQL中使用regexp_replace
,我已经开发出了一个匹配前n个字符的模式,如果最后一个字符不在我不想要的字符列表中,则不希望字符串以该字符结尾。
regexp_replace(pf.long_description, '(^.{1,150}[^ -:])', '\1...')::varchar(2000)
然而,我期望只是在字符串末尾加上省略号。但是实际得到的是前150个字符加上省略号,但是字符串继续一直到结尾。
为什么所有这些内容都没有被消除?
为什么所有的内容都没有被消除?
因为您没有请求这样做。 您要求将前2-151个字符替换为相同的字符和省略号。 如果您修改模式为(^.{1,150}[^ -:]).*
(注意尾随的.*
使regex_replace
在整个字符串上工作,而不仅仅是前缀),则应该会获得所需的效果。
我需要确认一下,您是否真的想要空格字符和冒号之间的字符范围:[^ -:]
?
如果要在字符类中包含文字 -
,请将其放在首位或末位。看起来您可能实际上想要的是[^ :-]
- 这只是排除了三个列出的字符。
有关手册中括号表达式的详细信息。
这应该是(基于@just已经提供的内容):
SELECT regexp_replace(pf.long_decript-ion, '(^.{1,150}[^ :-]).*$', '\1...');
但是使用substring()
应该会更便宜:
SELECT substring(pf.long_decript-ion, '^.{1,150}[^ :-]') || '...';