replace regex在postgresql中不起作用



我有一个带有字符串列的表。字符串中有一个单引号,我想去掉所有的单引号。例如:

"''hey, hey, we're the monkees''"

我的regex工作得很好,可以选择所有包含单引号的值。

select regexp_replace(colName, '%''%', '') from tblName;

但是当我想什么都不替换这个正则表达式时,它不会更新我的表。

UPDATE tblName SET colName = regexp_replace(colName, '%''%', '');

我也检查了这个

UPDATE tblName SET colName = replace(colName, '%''%', '');

Postgres中的不同函数和运算符使用三种不同的模式匹配语言中的一种,如手册的专用部分所述。

这里使用的%形式是SQLLIKE语法,其中%表示"任何字符的任何数字"。但是您正在使用的函数regexp_replace需要一个Posix正则表达式,其中等效的是.*(.表示任何字符,*表示重复零次或多次)。

还要注意,LIKE表达式必须匹配整个字符串,但Posix正则表达式不匹配,除非您将字符串的开头与^显式匹配,将字符串的结尾与$显式匹配。

所以'%''%'的直接翻译应该是'^.*''.*$',给你这个:

UPDATE tblName SET colName = regexp_replace(colName, '^.*''.*$', '');

在实践中,这将产生与更简单的相同的效果:

UPDATE tblName SET colname='' WHERE colname LIKE '%''%';

您的实际用例要简单得多:您希望用另一个固定字符串(空字符串,写为'')替换所有出现的固定字符串(',需要引用并转义为'''')。因此,您根本不需要任何模式匹配,只需使用replace:直接替换即可

UPDATE tblName SET colname=replace(colname, '''', '');

如果您将其限制为以开头的包含撇号的行,这可能会更快

UPDATE tblName SET colname=replace(colname, '''', '') WHERE colname LIKE '%''%';

%不是正则表达式字符

试试这个

select regexp_replace(colName, $$'$$, '','g') from tblName;

($$用于环绕字符串,而不是'以简化查询)(,'g')用于在找到第一个引号后继续。

UPDATE tblName SET colName = regexp_replace(colName, $$'$$, '','g');

最新更新