2009-11-25 31 views
5

我有這個正則表達式(不這樣做我想要什麼):/^.*\/(eu|es)(?:\/)?([^#]*).*/這實際上是對js版:/^.*/(eu|es)(?:/)?([^#]*).*/的Javascript正則表達式匹配的第一個發生

好了,它不會做我想要什麼當然,它的作品。 :)鑑於這種網址:

  • HTTP://本地主機/ ES - > [1] = ES,[2] = ''
  • HTTP://本地主機/ EU/BLA/BLA#WOP - > [1] = EU,[2] = 'BLA/BLA'
  • HTTP://本地主機/ EU/BLA/eubla - > [1] = EU,[2] = 'BLA'

前兩個網址按我的預期工作。第三個沒有做我想做的事。由於「歐盟」是後來發現的網址,它與第二個歐盟,而不是第一個匹配。所以我想它匹配這個:[1] ='eu',[2] ='bla/eubla'

我該怎麼做?

謝謝。 :)

回答

9

作出的第一個* ungreedy

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

順便說一句,你真的需要逃避的JavaScript *?這不工作嗎?

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

爲什麼星星逃脫了? – 2009-11-25 12:37:42

+0

是的,我想知道同樣的事情。 – 2009-11-25 12:41:31

+0

固定。他們不打算在那裏,這只是我編輯預覽的混亂。 – doup 2009-11-25 16:15:12

1

我想你想要的是非重複重複的第一個重複字符*。試試這個:

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

唯一的區別是第一個*後的問號?。如果缺失,*將匹配儘可能多的字符,導致您的第三個示例中出現意外行爲。

1

上面的答案是貪婪與非貪婪是好的,但爲什麼麻煩匹配URL的開始呢?只需開始你的表達:

/\/(eu|es) 

它會匹配找到的第一個行。

+0

沒錯,這也適用。無論如何,很高興知道這個不合理的事情。謝謝大家。 :) – doup 2009-11-25 16:22:51