正则表达式贪婪的问题

时间:2008-10-16 20:07:51

标签: regex regex-greedy

我确信这个很容易,但我尝试了很多变化,但仍然无法满足我的需求。事情太贪婪了,我不能让它停止贪婪。

鉴于文字:

test=this=that=more text follows

我想选择:

test=

我尝试过以下正则表达式

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

谢谢大家。

6 个答案:

答案 0 :(得分: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 :(得分:4)

你可能想要像

这样的东西

^(\ S +?=)

插入符号^将正则表达式锚定到字符串的开头。的? +之后+非贪婪。

答案 2 :(得分:3)

您可能正在寻找lazy quantifiers *?,+?,??和{n,n}?

答案 3 :(得分:1)

你应该能够使用它:

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

答案 4 :(得分:1)

懒惰的量词工作,但由于回溯,它们也可能会受到影响。

考虑一下你真正想要的是“一堆非平等,平等,以及更多非平等。”

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

[^=]{1}的示例仅匹配单个非等号字符。

答案 5 :(得分:0)

如果你只想要“text =”,我认为这只是一个简单的:

^(\w+=)

如果您确定字符串“text =”将始终开始该行,那么应该没问题。

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

  

this = that = more test = text follow

如果您使用上面的正则表达式,则结果为“this =”,如果您在结尾处使用reapeater限定符修改上述内容,请执行以下操作:

^(\w+=)*

你发现了一个巨大的“this = that =”,所以我只能想象琐碎的事情:

[th\w+=]*test=

再见。