正则表达式喜欢比赛中较短的比赛?(这比不贪婪更复杂)


9

我正在尝试创建用于在缓冲区内执行模糊搜索的脚本。主要思想是接受一些输入,然后.\{-}在每对字符之间插入,例如foo变为f.\{-}o.\{-}o

这工作得很好,但是提出了很多不理想的比赛。我认为模糊搜索应该首先产生最短的匹配项。考虑以下示例:

public void put()

put(so,p.\{-}u.\{-}t)进行模糊搜索将匹配整个字符串public void put,但是该put匹配范围内的较短字符串会更有用。

非贪心运算符擅长查找较早结束的匹配项,但我需要同时可以偏向于较晚开始的匹配项的东西。从概念上讲,它在两个方向上都应该是非贪婪的。这可能吗?


另请参阅:stackoverflow.com/q/15191291(不幸的是,您的问题没有答案)
Doorknob

1
@Doorknob,没有答案,但确实提出了一个要点:Regex不会从字符串的中间开始搜索。我可能需要涉及一些VimScript才能完成工作。我正在研究反转(长)匹配的想法,并在其中寻找反转的模式。
tommcdo

2
Tim Pope 今天发布了vim-haystack。听起来与您所需要的相似。也许您可以从中获得启发甚至使用它。
tokoyami 2015年

1
我希望比赛尽早开始,尽早结束,同时仍要满足比赛模式。
tommcdo

1
您应该看一下所谓的近似字符串匹配算法,它们比正则表达式更适合实现模糊查找器。
toro2k 2015年

Answers:


2

没有足够的示例,但是我认为这可以满足您的需求。

.*\zsp.\{-}u.\{-}t

put在您的示例中匹配而不是public void put。基本上是.*强制正则表达式引擎开始向后搜索字符串,因为首先要.*消耗整个字符串,然后才回溯,以查找的最新匹配项p.\{-}u.\{-}t


我以前曾经尝试过(但是直到现在都忘记了)。很好,但这意味着每行只会有一个匹配项(最后一个可能的匹配项)。我仍然希望pouty puppet能产生两场比赛。
tommcdo 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.