我确信这很容易,但我尝试了很多变化,但仍然无法满足我的需要。事情太贪婪了,我无法让它停止贪婪。
鉴于文字:
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+?=)
插入符号 ^ 将正则表达式锚定到字符串的开头。这 ?在 + 之后使 + 非贪婪。
您可能正在寻找惰性量词*?、+?、?? 和 {n, n}?
你应该可以使用这个:
(\S+?)=(\S.*)
惰性量词有效,但由于回溯,它们也可能会影响性能。
考虑一下你真正想要的是“一堆不等于,一个等于,还有一堆不等于”。
([^=]+)=([^=]+)
您的示例[^=]{1}
仅匹配单个不等于字符。
如果您只想要“text =”,我认为这很简单:
^(\w+=)
如果您确信字符串“text =”将始终开始该行,那应该没问题。
真正的问题是当字符串是这样的:
this=that= more test= 文字如下
如果您使用上面的正则表达式,则结果为“this=”,并且如果您在最后使用中继器限定符修改上面的内容,如下所示:
^(\w+=)*
你会发现一个巨大的“this=that=”,所以我只能想象微不足道的:
[th\w+=]*test=
再见。