2009-08-29 20 views
15

En otras palabras, tengo una cadena como:¿Cuál es la expresión regular que coincide con cualquier cosa excepto una comilla doble que no está precedida por una barra inclinada invertida?

"nada, escapó entre comillas dobles: \", sí" nada aquí no para ser igualada

¿Cómo responden a todo dentro de las comillas

.?

estoy pensando

^"((?<!\\)[^"]+)"

Pero mi cabeza gira, en caso de que sea positivo o negativo de búsqueda hacia atrás? o ¿funciona en absoluto?

¿Cómo puedo unir cualquier carácter excepto una comilla doble NO precedida de una barra diagonal inversa?

Respuesta

27

No es necesario de búsqueda hacia atrás:

"([^"]|\\")*" 

Así: cotizaciones de los partidos, y dentro de ellos: todos los personajes excepto una cotización ([^"]) o una cotización escapado (\\"), de manera arbitraria muchas veces (*).

+4

Como se mencionó en el caos, probablemente también desee manejar las barras diagonales inversas dobles por separado (aunque eso no fue especificado por el OP). –

+0

Ja, aquí voy de nuevo, complicando demasiado el problema. No pensé en una solución tan simple en absoluto, ¡gracias! –

+1

Probablemente usaría '\\.' para permitir que la barra invertida escape de cualquier carácter siguiente, lo que evita que la expresión regular se confunda con barra diagonal inversa, barra diagonal inversa, comilla doble (cerrada). Claramente, necesitas una expresión más compleja en lugar del punto si quieres manejar escapes octales o hex, o escapes Unicode, o ... –

2

"No precedido por" se traduce directamente en "aspecto negativo detrás", por lo que querría (?<!\\)".

Aunque esta es una pregunta que puede arruinar tu día: ¿qué pasa con la cadena "foo\\"? Es decir, una comilla doble precedida por dos barras diagonales inversas, donde en la mayoría de las sintaxis de escape estaríamos queriendo negar el significado especial de la segunda barra invertida precediéndola con la primera.

Ese tipo de cosas explica por qué las expresiones regulares no sustituyen a los analizadores sintácticos.

+0

Estoy bastante seguro de que un look negativo detrás es más caro que mi solución que utiliza un carácter negativo c muchacha y una alternancia. Ese es un caso trivial para motores regex. –

+0

Lo más probable, sí. – chaos

+0

¿Qué tal esto? '^" ([^ "] | (?

Cuestiones relacionadas