Regex para detectar la opción CON en un procedimiento almacenado

He estado trabajando en un código heredado en nuestra aplicación que detecta ciertas palabras clave en el texto de un procedimiento almacenado de SQL usando Regex y encontré un error que no puedo corregir del todo debido a mi conocimiento limitado de Regex.

Básicamente, la expresión regular que tengo actualmente funciona en todos menos en un caso:

(?<=\n\s*)(?<!with.*[\s\S]*)as

Debería devolver una coincidencia en esta versión de un procedimiento almacenado:

ALTER PROCEDURE [dbo].[p_obj_name_with_something] 
    @username [nvarchar](100) = null,
    @id [int] = null,
    @mode [int] = 0
AS
/*-------------------------------------------------------------------------

Sin embargo, no debería para esta versión, pero actualmente devuelve una coincidencia:

ALTER PROCEDURE [dbo].[p_obj_name_with_something] 
    @username [nvarchar](100) = null,
    @id [int] = null,
    @mode [int] = 0
WITH EXECUTE AS CALLER
AS
/*-------------------------------------------------------------------------

Quiero una coincidencia cuando la palabra clave CON no es se encuentra antes de la palabra clave AS, pero permitirá la palabra dentro del nombre o los parámetros del procedimiento almacenado.

La forma en que creo que funcionaría la detección es si la palabra clave CON tiene espacios en blanco (o una nueva línea) a cada lado, pero no puedo entender la sintaxis de expresiones regulares.

¿Alguna sugerencia?

preguntado el 27 de julio de 12 a las 18:07

mirar hacia atrás de longitud variable ??? -

¿Cuál es el idioma? ¡Como parece funcionar solo con .NET! -

Esto se usa en una aplicación winforms interna de C#. He estado usando Espresso para probarlo. -

@Ωmega: ¿Podría dar más detalles, por favor? Como dije, mi conocimiento de expresiones regulares es bastante limitado. -

Este no es un trabajo para expresiones regulares, lo siento... -

2 Respuestas

Visite este sitio:
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

fíjate en las líneas:

\s Coincide con cualquier espacio en blanco, incluidos espacios, tabulaciones, salto de página, etc. Equivalente a "[ \f\n\r\t\v]".
[^xyz] Un conjunto de caracteres negativos. Coincide con cualquier carácter no encerrado. Por ejemplo, "[^abc]" coincide con la "p" en "normal".

entonces.....
[\s]+[[CON]|[con][\s]+[[^AS]|[^as]]* desglose:
[\s]+ es el espacio en blanco a cada lado
[[con]|[CON][ verificación insensible a mayúsculas y minúsculas para con
[[^AS]|[^as]]* verificación que no distingue entre mayúsculas y minúsculas que coincidirá siempre que AS o no esté allí
espero que esto ayude

Respondido 27 Jul 12, 19:07

Aunque no es una respuesta real, encontré que la forma más fácil de hacerlo era hacer cumplir algunas reglas de convención de nomenclatura en nuestros procedimientos almacenados y modificar los 20 o más que violaban las reglas.

De hecho, ¡este es un caso en el que Regex no es la solución!

Respondido 15 ago 12, 10:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.