Tengo que buscar y eliminar una subcadena del texto usando expresiones regulares en PostgreSQL. La subcadena corresponde a la condición: <cualquier texto entre comillas dobles que contenga for|while inside>
Ejemplo
Texto:
PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", " Script for data loading: ", false, v_sql, 0);Entonces, mi propósito es encontrar y eliminar la subcadena "Script para carga de datos:". Cuando traté de usar el siguiente script:
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).*)(\")' , '');He reemplazado todos los textos entre comillas dobles. El resultado se parece a:
PERFORM xxkkcsort.f_write_log(||cc.source_table_name , false, null::text, 0);¿Cuál es una expresión regular adecuada para resolver el problema?
cualquier texto entre comillas dobles que contenga for|while dentro
SELECT regexp_replace(string, '"[^"]*\m(?:for|while)\M[^"]*"', ''); " ... literal " (sin significado especial aquí, por lo que no es necesario escapar)
[^"]* ... clase de carácter que incluye todos los caracteres excepto " , 0-n veces
\m ... comienzo de una palabra
(?:for|while) ... dos ramas entre paréntesis que no capturan
( regexp_replace() funciona con paréntesis de captura simple, pero es más barato de esta manera ya que no usa la subcadena capturada. Pero intente con el reemplazo '\1' , donde hace la diferencia ...)
\M ... final de una palabra
[^"]* ... como arriba
" ... como arriba
Eliminé \s de su expresión, ya que la descripción de la tarea no requiere estrictamente un carácter de espacio en blanco (final de cadena o puntuación que delimita la palabra ...).
Relacionada:
Puedes usar
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;Producción:
PERFORM xxkkcsort.f_write_log("INFO", "xxkkcsort.f_load_tables__outof_order_system", ||cc.source_table_name , false, null::text, 0);Vea la demostración de expresiones regulares y el violín DB . Detalles :
" - un " carácter[^"]* - cero o más caracteres que no sean "(for|while) - for o while\s - un espacio en blanco[^"]*" - cero o más caracteres que no sean " y luego un " carácter.