我必須在 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);
什么是解決問題的正確正則運算式?
uj5u.com熱心網友回復:
包含雙引號之間的任何文本的|,而內
SELECT regexp_replace(string, '"[^"]*\m(?:for|while)\M[^"]*"', '');
"... 字面意思"(這里沒有特殊含義,所以不需要轉義)
[^"]*...字符類包括除", 0-n 次以外的所有字符
\m...一個詞的開頭
(?:for|while)...非捕獲括號中的兩個分支
(也regexp_replace()適用于簡單的捕獲括號,但這種方式更便宜,因為您不使用捕獲的子字串。但嘗試使用替換'\1',它會有所不同......)
\M...一句話結束
[^"]* ... 像上面一樣
" ... 像上面一樣
我\s從你的表達中洗掉了,因為任務描述并不嚴格要求一個空格字符(字串的結尾或分隔單詞的標點......)。
有關的:
- 正則運算式或 LIKE 模式的轉義函式
uj5u.com熱心網友回復:
您可以使用
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);
請參閱正則運算式演示和資料庫小提琴。詳情:
"- 一個"字符[^"]*- 零個或多個字符,而不是"(for|while)-for或while\s- 一個空格[^"]*"- 零個或多個字符",然后是一個"字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335125.html
標籤:正则表达式 PostgreSQL
上一篇:用戶REFERENCE列的PostgreSQL遷移語法錯誤
下一篇:什么是.raw[0]
