我相信这个应该很容易,但我已经尝试了很多变化,仍然不能满足我的需求。问题在于它太贪心了,我无法让它停止贪心。
给定以下文本:
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.*)
懒惰量词确实有效,但由于回溯的原因,它们也可能会影响性能。
考虑到你真正想要的是“一堆不相等的字符、一个等号和更多不相等的字符”。
([^=]+)=([^=]+)
你的[^=]{1}
示例只匹配单个非等于字符。
^(\w+=)
如果您确定字符串“text =”始终在行首,则应该没问题。
真正的问题是当字符串像这样时:
this=that= more test= text follows
如果您使用上面的正则表达式,结果将是“this =”,如果您在末尾使用重复限定符修改上述内容,如下所示:
^(\w+=)*
你发现了一个巨大的"this=that=",所以我只能想象这是微不足道的:
[th\w+=]*test=
再见。