Entre comillas trato de excluir el ; caracteres usando expresiones regulares en Node.js.
Por ejemplo, tengo un sql como el siguiente:
update codes set character='.' where character = ';' and write_date < now()-5 ; Quiero encontrar filas afectadas antes de ejecutar la declaración. Escribí debajo de la expresión regular pero no funciona correctamente si la hay ; carácter entre comillas como arriba
const regexp = /update\s+((.|\n)[^;]*?)\s+set\s+((.|\n)[^;]*?)\s+where\s+((.|\n)[^;]*?);/ig; regexp.exec(str)Rendimiento esperado:
table: codes where: character = ';' and write_date < now()-5Pero obtengo:
table: codes where: character = ';Puedes usar
update\s+([^;]*?)\s+set\s(?:[^;]*?\s)?where\s+((?:'[^']*'|[^;])*?)\s*;Vea la demostración de expresiones regulares . Detalles :
update - una palabra\s+ - uno o más espacios en blanco([^;]*?) - Grupo 1: cero o más, pero la menor cantidad posible de caracteres que no sean ;\s+ - uno o más espacios en blancoset - una palabra\s - un espacio en blanco(?:[^;]*?\s)? - una secuencia opcional de caracteres que no sean ; la menor cantidad posible y luego un espacio en blancowhere - una palabra\s+ - uno o más espacios en blanco((?:'[^']*'|[^;])*?) - Grupo 2: cero o más (la menor cantidad posible) secuencias de ' , cero o más no ' s, y luego ' , o cualquier carácter único que no sea un ;\s* - cero o más espacios en blanco; - un ; carbonizarse.En primer lugar, no estoy seguro de para qué sirve (.|\n) , así que lo estoy ignorando.
Creo que hay dos problemas con su expresión regular, cambiar cualquiera probablemente resolverá su problema, pero cambiaría ambos, solo para estar seguro.
el ? después de * hace que * no sea codicioso, lo que significa que la expresión regular coincidirá lo menos posible, de modo que final ; en la expresión regular coincidirá con la primera posible ; encuentra, no el último posible. Entonces dejaría el ? afuera.
La expresión regular no usa $ para anclarse al final de la cadena. Agregar $ después de ; al final (posiblemente \s*$ si espera un espacio en blanco adicional al final de la cadena). Si hace esto, en realidad no necesita excluir ; . Y puede ser una buena idea agregar ^ (o ^\s* ) al principio para anclarse al principio de la cadena también.
Entonces la expresión regular resultante es
const regexp = /^\s*update\s+((.|\n).*)\s+set\s+((.|\n).*)\s+where\s+((.|\n).*);\s*$/ig;Finalmente, algunas ideas conceptuales: ¿Por qué estás haciendo esto en primer lugar? En lugar de comenzar con UPDATE SQL, ¿por qué no comienza con la estructura?
{ table: "codes", where: "character = ';' and write_date < now()-5" }y construir tanto la ACTUALIZACIÓN como los SQL SELECCIONADOS a partir de eso?
O si solo tiene UPDATE SQL, en lugar de usar una expresión regular, hay bibliotecas de analizador SQL ( ejemplo ) que probablemente serían más confiables.