首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得缓冲区中的所有单词,其中至少有2个字符以某些字符开头?

如何获得缓冲区中的所有单词,其中至少有2个字符以某些字符开头?
EN

Stack Overflow用户
提问于 2017-12-29 13:24:19
回答 1查看 90关注 0票数 1

前言

我知道有match()matchstr()等等,但是似乎没有函数返回字符串中的所有匹配(不是子匹配)。处理matchstrpos()是可能的,但是每次都有很大的开销解析正则表达式。这就是为什么我将split()函数用于与性能相关的任务。

目标

我需要找到缓冲区中的所有单词,其中至少有两个字符以“文本”开头。这个模式很简单。例如,要查找以"f“开头的所有单词,我使用f\w\+,但不知道如何逆模式传递到split()函数。现在我使用\W,然后使用filter()函数过滤单词。我认为算法可能会更快。

当前代码

代码语言:javascript
复制
function! completion#filter(base, lastIndex, i, word)
    return a:word[1] != "" && a:word[0:a:lastIndex] ==# a:base

    " also tried this
    " return a:word[1] != "" && strridx(a:word, a:base, 0) == 0
endfunction

let words = split(join(getline(1, "$"), "\n"), '\W\+')
call filter(words, funcref("completion#filter", [a:base, len(a:base) - 1]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 15:09:59

下面的解决方案是从这里获得的:https://vi.stackexchange.com/questions/4305/is-it-possible-to-get-the-matched-string-after-calling-search

请考虑在那里留下一个向上的选票!

最基本的技巧是:s\= (:h :s\=)与:s//n (:h :s)相结合。

:s\=允许我们在:s//命令中计算vimscript,而n标志允许我们跳过actuall。

因此,在最简单的形式下,它可以像这样使用:

代码语言:javascript
复制
let b = [] | execute ':keeppatterns %s/f\w\+/\=add(b, submatch(0))/gn' | echo b

如您所见,您现在有了一个包含所有搜索结果的列表。

在上面的链接中,您可以找到一个以函数作为参数的通用解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48023309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档