2009-11-25 17 views
5

Ho questa regex (che non faccio quello che voglio): /^.*\/(eu|es)(?:\/)?([^#]*).*/ che in realtà è la versione js di: /^.*/(eu|es)(?:/)?([^#]*).*/Javascript Regex Partita la prima del verificarsi

Beh, non fare quello che voglio , certo che funziona. :) Dato questo 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'

I primi due URL funzionano come mi aspettavo. Il terzo non sta facendo quello che voglio. Poiché "eu" si trova più tardi nell'url, fa la corrispondenza con la seconda eu anziché la prima. Quindi mi piacerebbe che corrispondesse a questo: [1] = 'eu', [2] = 'bla/eubla'

Come devo farlo?

Grazie. :)

risposta

9

Effettuare la prima * ungreedy

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

Btw, non si ha realmente bisogno di fuggire * in javascript? Non funzionerà?

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

Perché la stella è sfuggita? –

+0

Sì, mi stavo chiedendo la stessa cosa. –

+0

corretto. Non erano destinati a essere lì, è stata solo una confusione che ho avuto con l'anteprima di editor. – doup

1

Penso che quello che vuoi sia una ripetizione non aggressiva per il primo carattere di ripetizione *. Prova questo:

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

L'unica differenza è il punto di domanda ? dopo il primo *. Se questo manca, lo * corrisponderà al maggior numero possibile di caratteri, portando al comportamento indesiderato nel terzo esempio.

1

Le risposte di cui sopra re l'avido versus non-avido vanno bene, ma perché preoccuparsi corrispondenza dell'inizio della URL in ogni caso? Basta iniziare la tua espressione con:

/\/(eu|es) 

e corrisponderà al primo trovato sulla linea.

+0

È vero, anche questo funziona. Ad ogni modo, è bello conoscere la cosa non degna di nota. Grazie a tutti. :) – doup

Problemi correlati