3

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

鉴于文字:

test=this=that=more text follows

我只想选择:

test=

我尝试了以下正则表达式

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

谢谢大家。

4

6 回答 6

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=然后停止。您可以在多行或整个文档匹配等大型搜索中看到效率提升。

于 2008-10-16T20:13:44.753 回答
4

你可能想要类似的东西

^(\S+?=)

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

于 2008-10-16T20:15:56.343 回答
3

您可能正在寻找惰性量词*?、+?、?? 和 {n, n}?

于 2008-10-16T20:32:52.547 回答
1

你应该可以使用这个:

(\S+?)=(\S.*)
于 2008-10-16T20:14:50.587 回答
1

惰性量词有效,但由于回溯,它们也可能会影响性能。

考虑一下你真正想要的是“一堆不等于,一个等于,还有一堆不等于”。

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

您的示例[^=]{1}仅匹配单个不等于字符。

于 2008-10-16T22:08:42.590 回答
0

如果您只想要“text =”,我认为这很简单:

^(\w+=)

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

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

this=that= more test= 文字如下

如果您使用上面的正则表达式,则结果为“this=”,并且如果您在最后使用中继器限定符修改上面的内容,如下所示:

^(\w+=)*

你会发现一个巨大的“this=that=”,所以我只能想象微不足道的:

[th\w+=]*test=

再见。

于 2009-04-10T20:57:30.063 回答