2012-01-26 11 views
9

Estoy tratando de obtener una búsqueda hacia delante opcional, pero estoy teniendo problemas en los que, tan pronto como lo hago opcional (Agrega un ? después de él), ya no coincide incluso cuando los datos están ahí.búsqueda hacia delante expresiones regulares opcional

Como breve resumen, estoy tratando de sacar params cadena de consulta específicos de un URI. Ejemplo:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ 
    .exec('foo.html?foo=true&bar=baz') 

I va a romper que un poco:

.*foo.html\??  // filename == `foo.html` + '?' 
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value 
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value 

El ejemplo anterior funciona perfectamente bajo la condición de que tanto foo y bar existen como parámetros en la cadena de consulta. La cuestión es que estoy tratando de hacer que estos opcional, por lo que cambió a:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/ 
           ↑     ↑ 
    Added these question marks ─┴──────────────────┘ 

y ya no coincide con ningún parámetro, aunque sigue coincidiendo con foo.html. ¿Algunas ideas?

+0

¿Por qué usa expresiones regulares para esto? Simplemente divida la cadena y almacene los pares clave/valor en un objeto. – ThiefMaster

+0

@ThiefMaster - Porque quiero :) Y quiero aún más ahora que no funcionará. En realidad, es simplemente porque el código es mucho más corto cuando solo necesito obtener 2 params. –

+0

¿Por qué necesita mirar hacia adelante? Para hacer coincidir foo.html? Bar = baz & foo = true también? – Bergi

Respuesta

4

tratar de poner los signos de interrogación en el preanálisis:

...((?=(?:.*foo=([^\&]+))?)... 

parece extraño, pero creo que una expresión regular de buen aspecto no era el objetivo :-)

Además, tienen que pensado en esto?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/ 
+1

Gracias, el primero funciona. Creo que esto es necesario porque el motor podría ser la optimización '(? =)?' Por completo (es decir, simplemente ignorarlo) ya que una expresión regular no coincidente opcional es, así, sin sentido. Simplemente lo uso para atrapar algo más. Su segundo uno trabajaría también, excepto que necesitaría algunos ajustes para hacer que cada parámetro opcional, y hay un poco más de lógica después de los hechos ya que se necesita para averiguar qué parámetro es donde (que había necesidad de eliminar los dos '? : 's 'a continuación, comprobar en contra de aquellos) –

+0

de todos modos, por lo que la búsqueda hacia delante opcional llevaría a igualar una cadena vacía. – Bergi

Cuestiones relacionadas