无法为子字符串设置正则表达式



我必须在PostgreSQL中使用regexp从文本中找到并删除子字符串。子字符串对应于条件:<包含>的双引号之间的任何文本for|whileinside>

文本:

PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", "   Script for data loading: ", false, v_sql, 0);

所以,我的目的是找到并删除子字符串"脚本数据加载:"。当我尝试使用下面的脚本时:

SELECT regexp_replace(
'PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", "> Table for loading: "||cc.source_table_name , false, null::text, 0);'
, '(")(.*(for|while)(s).*)(")'
, '');

我替换了双引号内的所有文本。结果如下:

PERFORM xxkkcsort.f_write_log(||cc.source_table_name , false, null::text, 0);

解决这个问题的合适正则表达式是什么?

你可以使用

SELECT regexp_replace(
'PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", "> Table for loading: "||cc.source_table_name , false, null::text, 0);',
'"[^"]*(for|while)s[^"]*"',
'') AS Result;

输出:

PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", ||cc.source_table_name , false, null::text, 0);

请参阅正则表达式演示和DB提琴。细节:

  • "- a"char
  • [^"]*-"以外的零个或多个字符
  • (for|while)-forwhile
  • s- a空格
  • [^"]*"- 0个或多个"以外的字符,然后是"字符。

任何双引号之间包含for|whileinside

的文本
SELECT regexp_replace(string, '"[^"]*m(?:for|while)M[^"]*"', '');

"…literal"(这里没有特殊含义,所以不需要转义)

[^"]*…字符类,包括除"以外的所有字符,0-n次

m…单词的开头

(?:for|while)…非捕获括号
中的两个分支(regexp_replace()也适用于简单的捕获括号,但这种方式更便宜,因为您不使用捕获的子字符串。但是尝试替换'1',它会有所不同…)

M…字尾

[^"]*…像上面的

"…像上面的

我从表达式中删除了s,因为任务描述并不严格要求空白字符(字符串结束或分隔单词的标点符号…)。

相关:

  • 正则表达式或LIKE模式的转义函数

最新更新