2011-06-15 41 views
9

Actualmente estoy escribiendo un analizador para el código de ColdFusion. Estoy usando un regex (en C#) para extraer el nombre de fuente de datos de la etiqueta cfquery.Regex para citas coincidentes y comillas simples

Por el momento, la expresión regular es el siguiente <cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")

funciona bien para las cadenas como <cfquery datasource="myDS" o <cfquery datasource='myDS'

Pero se vuelve loco cuando analizar cadenas como <cfquery datasource="#GetSourceName('myDS')#"

Obviamente la parte de la expresión regular (?: '| ") es la causa. ¿Hay alguna manera de hacer coincidir solo la comilla simple cuando th ¿El primer partido fue una sola cita? ¿Y solo coincide con la comilla doble cuando el primer partido era una comilla doble?

¡Gracias de antemano!

Respuesta

6

Editar: Creo que esto debería funcionar en C# sólo tiene que hacer una referencia posterior:

datasource\s*=\s*('|")(.*)(?:\1) 

o tal vez

datasource\s*=\s*('|")(.*)(?:$1) 

partidos datasource="#GetSourceName('myDS')#" con una referencia de nuevo a la primera coincidencia con \1 .

Por supuesto, no puede ignorar el primer grupo de captura con ?: y todavía tiene este trabajo. Además, es posible que desee establecer la bandera lazy para no coincidir con "

1

Sugiero usar dos expresiones regulares diferentes si es posible, o dividir la expresión regular de una manera diferente.

Para una sola expresión regular, teniendo en cuenta la cuestión @ Mike publicó, ("[^"]*")|('[^']*') A continuación, se puede analizar fuera de las comillas.

La otra forma posible de hacerlo es usando lookahead/lookbehind, pero eso tiende a ser complicado y no es universalmente compatible.

+0

Me parece que su expresión tiene el segundo * en el lugar equivocado, debería ser ("[^"] * ") | ('[^'] * ') ... a menos que su intención fuera hacer coincidir muchos caracteres individuales constantes como 'x''y''z'. –

+1

Creo que tienes razón. Reparado. Esto tampoco maneja comillas simples o dobles, pero la pregunta y la respuesta son tan antiguas que la dejaré incompleta (aunque ahora correcto). –

Cuestiones relacionadas