2012-08-29 8 views
8

tengo mis expresiones regulares /'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
y mi código de prueba ('He said, "You're cool."' , 'Rawr')
(Mi código de prueba simula parámetros que se pasa a una función.)

voy a explicar mi expresión regular como yo lo entiendo y es de esperar que algunos de ustedes puede arrojar algo de luz sobre mi problema.

1) /' significa que al comienzo de la cadena coincidente, es necesario que haya '

2) (.*) medios de captura de cualquier carácter excepto \n 0 o más veces

3) (?:(?:4)|(?:5)) medios no captan, pero tratan de hacer el paso 4 y si no funciona el paso 5 tRY

4) (?:'\s*,\s*) medios no captan, pero es necesario que haya un ' con 0 o más caracteres de espacio en blanco seguido de un , con 0 o más caracteres de espacio en blanco

5) (?:'\)) medios no captan, pero es necesario que haya ')

por lo que parece que debería devolver este (y esto es lo que quiero):
' + He said, "You're cool." + ' ,
pero vuelve:
' + He said, "You're cool."' , 'Rawr + ')

Si cambio de código de prueba a ('He said, "You're cool."' , 'Rawr' (sin paréntesis final) devuelve lo que quiero, pero tan pronto como añado que último paréntesis, a continuación, parece que mi operador OR hace lo que quiere. Quiero probar primero si hay una coma, y ​​romper allí si hay una, y si no hay una marca para un paréntesis.

He intentado cambiar los puntos del paso 4 y el paso 5, pero aun así el operador OR parece siempre predeterminado al lado (?:'\)). ¿Cómo puedo igualar la cantidad más corta posible?RegExp - ¿Cómo puedo igualar la cantidad más corta posible?

+0

El comienzo de la cadena sería '/ ^', no '/', fwiw. Personalmente no estoy convencido de que use una expresión regular para lo que estás tratando de hacer, sino más bien como un pequeño analizador. La expresión regular confusa es confusa. –

+0

@DaveNewton - Sí, lo sé. Es por eso que dije al comienzo de la cadena coincidente. Tal vez debería haber dicho al principio de la porción correspondiente de la cadena. O cuando comienza el partido, debe comenzar con un '''. – Aust

Respuesta

15

No creo que su problema sea el operador OR, sino el greediness del .*. Coincidirá con la cadena completa y luego volver -cargar hasta que coincidan las siguientes expresiones. La primera coincidencia en este proceso de retroceso será 'He said, "You're cool."' , 'Rawr + '). Pruebe .*? en su lugar!

+1

Bergi eres un genio! Eso funciona perfectamente. :) ¿Te importa explicar un poco más por qué funciona? No importa, entendí de su enlace. Gracias de nuevo. :) – Aust

+0

Es posible que desee leer http://stackoverflow.com/a/5319978/1048572 – Bergi

Cuestiones relacionadas