2008-10-16 75 views
3

我确定这个很容易,但我已经尝试了一大堆变体,仍然无法匹配我所需要的。事情太贪婪了,我不能让它停止贪婪。正则表达式贪婪问题

中的文字:

test=this=that=more text follows 

我只想选择:

test= 

我已经尝试了所有的正则表达式如下

(\S+)=(\S.*) 
(\S+)?= 
[^=]{1} 
... 

感谢。

+1

你说你只想选择“text =”,但是这不会发生在你的示例文本中的任何地方! – theraccoonbear 2008-10-16 20:17:31

+0

wooops ..你是对的..它应该已经测试= ..我会编辑它 – 2008-10-16 20:25:11

回答

11

这里:

// matches "test=, test" 
(\S+?)= 

or 

// matches "test=, test" too 
(\S[^=]+)= 

你应该考虑使用在第一第二个版本。给定字符串"test=this=that=more text follows",版本1将匹配test=this=that=然后继续解析到字符串的末尾。它会回溯,并找到test=this=,继续回溯,并找到test=,继续回溯,并解决test=,因为它是最终答案。

版本2将匹配test=然后停止。您可以在多行或全文档匹配等大型搜索中看到效率提升。

1

您应该能够使用:

(\S+?)=(\S.*) 
4

你可能要像

^(\ S + =?)

这个^锚定正则表达式的开始串。这个? +使得+非贪心之后。

1

懒惰的量词可以工作,但是由于回溯,他们也可能是一个性能问题。

想想你真正想要的是“一堆不等于,一个等于,一堆更不等于”。

([^=]+)=([^=]+) 

[^=]{1}的例子只匹配一个非等号字符。

0

,如果你只想要“文本=”,我认为,一个简单的:如果你是舒尔关于字符串“文本=”永远启动线

^(\w+=) 

应该罚款。

,真正的问题是,当字符串是这样的:

此=是=更多测试=全文如下

如果你使用上述结果的正则表达式是“此=”和如果修改了上面,并在最后的reapeater预选赛中,像这样:

^(\w+=)* 

你会发现一个巨大的“这是= =”,所以我只能想象的简单:

[th\w+=]*test= 

再见。