正则表达式贪婪模式问题

3

我相信这个应该很容易,但我已经尝试了很多变化,仍然不能满足我的需求。问题在于它太贪心了,我无法让它停止贪心。

给定以下文本:

test=this=that=more text follows

我只想选择:

test=

我尝试了以下的正则表达式。
(\S+)=(\S.*)
(\S+)?=
[^=]{1}
...

感谢大家。

1
你说你只想选择"text=",但是在你的示例文本中并没有出现这个内容! - theraccoonbear
哎呀,你说得对,应该是test=..我会编辑它。 - Matt P
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=然后停止。在较大的搜索(如多行或整个文档匹配)中可以看到效率提高。


4
你可能需要类似于
^(\S+?=) 的东西。插入符号 ^ 将正则表达式锚定到字符串的开头。在 + 后面加上 ? 使 + 非贪婪匹配。

3

1
你应该能够使用这个:
(\S+?)=(\S.*)

我本以为我尝试了所有这些变体。我切换到一个 GUI 正则表达式编辑器进行测试,但似乎它并没有“正常工作”。我在代码中添加了 ?,现在一切都好了。谢谢大家! - Matt P
这将在第一组中实际获取“text”,并在第二组中获取“this=that=more text follows”。Owen的将在两个组中分别获取“text=”和“text”。我假设他希望基于之前的尝试去掉“=”。 - chills42

1

懒惰量词确实有效,但由于回溯的原因,它们也可能会影响性能。

考虑到你真正想要的是“一堆不相等的字符、一个等号和更多不相等的字符”。

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

你的[^=]{1}示例只匹配单个非等于字符。


0
如果你只想要"text=",我认为简单的方法是:
^(\w+=)

如果您确定字符串“text =”始终在行首,则应该没问题。

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

this=that= more test= text follows

如果您使用上面的正则表达式,结果将是“this =”,如果您在末尾使用重复限定符修改上述内容,如下所示:

^(\w+=)*

你发现了一个巨大的"this=that=",所以我只能想象这是微不足道的:

[th\w+=]*test=

再见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接