¿Cómo se pueden resaltar las palabras clave del SQL usando una expresión regular?

votos
31

Me gustaría destacar las palabras clave SQL que aparecen dentro de una cadena en un resaltador de sintaxis. Estas son las reglas que me gustaría tener:

  • Coincide con las palabras clave SELECT y FROM (se añadirán otras, pero empezaremos aquí). Deben ser todos los casquillos
  • Debe estar contenida en una cadena... ya sea que comience con 'o
  • La primera palabra de esa cadena (ignorando los espacios en blanco que la preceden) debería ser una de las palabras clave.

Esto, por supuesto, no es exhaustivo (puede ignorar los escapes dentro de una cadena), pero me gustaría empezar aquí.

Aquí hay algunos ejemplos:

  • SELECCIONE * DE LA PRINCIPAL -- no coincidirá (no en una cadena)
  • SELECCIONE el nombre de la principal... coincidirá con

  • SELECCIONE el nombre desde el principal... coincidirá con
  • Aquí hay una declaración SQL:

SELECCIONE * DE LA PRINCIPAL -- No, la cadena no empieza con una palabra clave (SELECT...).

Pero entonces no sería de ancho fijo, ya que no sabemos cuándo empieza la cuerda. Algo así como:

Pero esto, por supuesto, no funcionará:

enter

¿Sería posible hacer algo así en un solo regex?

Publicado el 25/05/2020 a las 00:37
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Es probable que una expresión regular adecuada se vuelva bastante compleja, especialmente a medida que las reglas evolucionan más. Como han señalado otros, tal vez valga la pena considerar el uso de un analizador en su lugar. Dicho esto, aquí hay un posible regex que intenta cubrir las reglas mencionadas hasta ahora:

(["'])\s*(SELECT)(?:\s+|\s.*\s)(FROM)(?:\s+.*)?\1(?:[^\w]|$)

Regular expression visualization

Demostraciones en línea

  1. Demostración de Debuggex
  2. Demo de Regex101

Explicación

Como se puede ver en la visualización anterior, el regex busca una cita doble o simple al principio (guardada en el grupo de captura #1) y luego coincide con esta referencia al final a través de \1. Las SELECTFROMpalabras clave son capturadas en los grupos de captura #2 y #3. (La ?:(x|y)sintaxis asegura que no hay más grupos para otras opciones ya que ?:al principio de una opción la excluye como grupo de captura. ) Hay algunos otros detalles opcionales como limitar lo que se permite entre el SELECTy FROMy no contar la comilla final si es inmediatamente sucedida por un carácter de la palabra.

Resultados

id="pre-0"
Respondida el 31/05/2020 a las 13:55
fuente por usuario

votos
0

Podrías usar grupos de captura:

(.*["']\s*\K)(?(1)(SELECT|FROM).*(SELECT|FROM)|)

En este caso, 2 dólares se referirían a la primera palabra clave y 3 dólares a la segunda. Esto también sólo funciona si hay sólo dos palabras clave y una sola cadena en una línea, lo cual parece ser cierto en todos sus ejemplos, pero si esas restricciones no funcionan para usted, hágamelo saber.

Respondida el 28/05/2020 a las 19:39
fuente por usuario

votos
0

Acabo de probar el fuelle regexp:

enter image description here

Si necesitas añadir otros comandos, la cosa puede tener un pequeño truco, porque algunas palabras clave no se aplican. Por ejemplo: ALTER TABLE mytable o UPDATE SET col = val;. Para estos escenarios necesitarás crear subgrupos y el regexp puede volverse lento.

¡Saludos!

Respondida el 28/05/2020 a las 21:19
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more