我必须在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)
-for
或while
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模式的转义函数