2010-03-23 98 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="([^"]*)".* 

这就避免了无限的搜索。*和准确地将匹配第一个报价。

相关问题