2009-11-25 18 views
5

tengo esta expresión regular (que no hago lo que quiero): /^.*\/(eu|es)(?:\/)?([^#]*).*/ que en realidad es la versión JS de: /^.*/(eu|es)(?:/)?([^#]*).*/Javascript expresiones regulares de ajuste de la primera ocurrencia del

Bueno, no hace lo que yo quiero Por supuesto que funciona. :) Dada esta URL:

  • http: // localhost/es -> [1] = es, [2] = ''
  • http: // localhost/eu/bla/bla # wop - > [1] = eu, [2] = 'bla/bla'
  • http: // localhost/eu/bla/eubla -> [1] = eu, [2] = 'bla'

Las dos primeras URL funcionan como esperaba. El tercero no está haciendo lo que quiero. Como "eu" se encuentra más adelante en la url, coincide con la segunda ue en lugar de la primera. Entonces me gustaría que coincida con esto: [1] = 'eu', [2] = 'bla/eubla'

¿Cómo debo hacerlo?

Gracias. :)

Respuesta

9

Hacer la primera * ungreedy

/^.\*?\/(eu|es)(?:\/)?([^#]\*).\*/ 

Por cierto, lo que realmente necesita para escapar * en javascript? ¿No funcionará esto?

/^.*?\/(eu|es)(?:\/)?([^#]*).*/ 
+1

¿Por qué se escapó la estrella? –

+0

Sí, me preguntaba lo mismo. –

+0

Reparado. No estaban destinados a estar allí, solo ha sido una confusión que tuve con la vista previa del editor. – doup

1

Creo que lo que quieres es repetición nongreedy para el primer carácter de repetición *. Prueba esto:

/^.\*?\/(eu|es)(?:\/)?([^#]\*).\*/ 

La única diferencia es el signo de interrogación ? después de la primera *. Si esto falta, el * coincidirá con tantos caracteres como sea posible, lo que dará lugar a un comportamiento no deseado en el tercer ejemplo.

1

Las respuestas anteriores re contra los codiciosos no expansivo están muy bien, pero ¿por qué preocuparse que coincide con el inicio de la URL de todos modos? Simplemente comience su expresión con:

/\/(eu|es) 

e coincidirá con el primero encontrado en la línea.

+0

Es cierto, esto también funciona. De todos modos, es bueno saber lo desagradable. Gracias a todos. :) – doup

Cuestiones relacionadas