【问题标题】:Can't fit regexp for a substring不能适合子字符串的正则表达式
【发布时间】:2021-12-10 05:15:19
【问题描述】:

我必须在 PostgreSQL 中使用正则表达式从文本中查找并删除一个子字符串。子字符串对应的条件是:for|while的双引号之间的文本>

示例

文字:

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);

解决问题的正确正则表达式是什么?

【问题讨论】:

    标签: regex postgresql


    【解决方案1】:

    你可以使用

    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);
    

    请参阅 regex demo 和 DB fiddle。 详情:

    • " - 一个 " 字符
    • [^"]* - 除" 之外的零个或多个字符
    • (for|while) - for 或 while
    • \s - 一个空格
    • [^"]*" - 除了" 和" 字符之外的零个或多个字符。

    【讨论】:

      【解决方案2】:

      双引号之间包含 for|while 的任何文本

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

      " ...字面意思"(这里没有特殊含义,所以不用转义)

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

      \m ... beginning of a word

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

      \M ... end of a word

      [^"]* ...如上

      " ...如上

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

      相关:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 2015-07-13
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        相关资源
        最近更新 更多