PostgreSQL正则匹配删除含for/while的双引号包裹子串问题求解
问题原因
你之前的正则表达式使用了贪婪匹配规则的.*,会从文本中第一个双引号开始,一直匹配到最后一个双引号结束,因此误删了所有双引号包裹的内容。
正确实现方案
我们需要限制匹配范围为单个双引号对内部,通过[^"]匹配非双引号的字符,避免跨双引号匹配:
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)[^"]*"', '', 'g' );
执行后得到的正确结果为:
PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", ||cc.source_table_name , false, null::text, 0);
正则说明
":匹配双引号的开头[^"]*:匹配任意数量、除了双引号之外的字符,确保不会跨到其他双引号包裹的段落(for|while):匹配目标关键字for或者while[^"]*:匹配关键字之后、双引号之前的所有非双引号字符":匹配双引号的结尾- 末尾的
g参数代表全局替换,如果你需要同时忽略关键字的大小写(比如匹配For、WHILE等写法),可以把参数改成gi
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

