我确定这个很容易,但我已经尝试了一大堆变体,仍然无法匹配我所需要的。事情太贪婪了,我不能让它停止贪婪。正则表达式贪婪问题
中的文字:
test=this=that=more text follows
我只想选择:
test=
我已经尝试了所有的正则表达式如下
(\S+)=(\S.*)
(\S+)?=
[^=]{1}
...
感谢。
我确定这个很容易,但我已经尝试了一大堆变体,仍然无法匹配我所需要的。事情太贪婪了,我不能让它停止贪婪。正则表达式贪婪问题
中的文字:
test=this=that=more text follows
我只想选择:
test=
我已经尝试了所有的正则表达式如下
(\S+)=(\S.*)
(\S+)?=
[^=]{1}
...
感谢。
这里:
// 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=
然后停止。您可以在多行或全文档匹配等大型搜索中看到效率提升。
您应该能够使用:
(\S+?)=(\S.*)
你可能要像
^(\ S + =?)
这个^锚定正则表达式的开始串。这个? +使得+非贪心之后。
您可能正在寻找lazy quantifiers * ?, + ?, ??和{n,n}?
懒惰的量词可以工作,但是由于回溯,他们也可能是一个性能问题。
想想你真正想要的是“一堆不等于,一个等于,一堆更不等于”。
([^=]+)=([^=]+)
[^=]{1}
的例子只匹配一个非等号字符。
,如果你只想要“文本=”,我认为,一个简单的:如果你是舒尔关于字符串“文本=”永远启动线
^(\w+=)
应该罚款。
,真正的问题是,当字符串是这样的:
此=是=更多测试=全文如下
如果你使用上述结果的正则表达式是“此=”和如果修改了上面,并在最后的reapeater预选赛中,像这样:
^(\w+=)*
你会发现一个巨大的“这是= =”,所以我只能想象的简单:
[th\w+=]*test=
再见。
你说你只想选择“text =”,但是这不会发生在你的示例文本中的任何地方! – theraccoonbear 2008-10-16 20:17:31
wooops ..你是对的..它应该已经测试= ..我会编辑它 – 2008-10-16 20:25:11