2010-03-23 97 views
330

我的正則表達式看起來像正則表達式停在第一場比賽

<xxxx location="file path/level1/level2" xxxx some="xxx"> 

我只在部分分配給位置的報價感興趣。沒有貪婪的開關,它不應該像以下那樣容易嗎?

/.*location="(.*)".*/ 

似乎沒有工作。

+0

你的來源是什麼,它是HTML或XML或什麼的? – 2010-03-23 20:39:34

+14

爲什麼這是一個社區wiki?這是一個真正的問題。現在太晚了。 – 2010-03-23 20:41:08

+0

@Kurresmack它是XML。 – publicRavi 2010-03-23 20:41:15

回答

686

您需要使您的正則表達式不貪婪,因爲默認情況下,"(.*)"將匹配所有"file path/level1/level2" xxx some="xxx"

相反,你可以讓你的點星非貪婪,這將使其儘可能少的字符可能匹配:一個量詞(?*+

/location="(.*?)"/ 

添加?使得非-貪婪。

+25

FWIW,在使用VIM之前,這個正則表達式需要有點不同:而不是'。*?'它是'。\ { - }'用於非貪婪的匹配。 – SooDesuNe 2011-03-24 00:21:24

+24

謝謝丹尼爾。 **「在量詞上添加一個?(?,*或+)使其非貪婪。」**對我有幫助。 – PhatHV 2014-08-20 02:30:51

+5

The?描述了我試圖弄清楚這一點的困惑。多合適。 – 2016-04-18 17:38:49

11

如果您的引擎支持它,請使用非貪婪匹配。添加?捕獲內部。

/location="(.*?)"/ 
36

location="(.*)"將匹配來自some="xxx後,除非你把它非貪婪「location=直到後」。所以你要麼需要.*?(即使它不貪心),要麼用[^"]*更好地替換.*

+5

+1,'[^「] *」'比*更清晰*「」任何一天 – Kip 2010-03-23 20:47:20

+3

[^「] *對於大多數正則表達式引擎來說也可能更快,因爲它不需要在當前模式之後查找模式。 – 2012-07-21 10:34:55

+1

@Kip:你可能是對的,但'。*?'表示法比'[^「] *' – Bondax 2015-09-02 07:45:23

20

如何

.*location="([^"]*)".* 

這就避免了無限的搜索。*和準確地將匹配第一個報價。

相關問題