一行中所有匹配的开始列和结束列的列表

时间:2014-08-18 09:41:26

标签: regex list vim match lines

我试图在一行中创建所有匹配的起始列列表和结束列列表。

这就是我所做的:

LINE1

test is PASSED as its the list "that" is [passed] as 

搜索:\<[a-zA-Z\x7f-\xff]\+\>
(找到所有单词)

命令

let MatchesStart = [] | 1s/\<[a-zA-Z\x7f-\xff]\+\>/\=add(MatchesStart,match(getline(1),submatch(0)))/gn
let MatchesEnd = []   | 1s/\<[a-zA-Z\x7f-\xff]\+\>/\=add(MatchesEnd,matchend(getline(1),submatch(0)))/gn

结果

MatchesStart = [0,5,8,9,18,22,26,32,5,8,9]
MatchesEnd = [4,7,14,11,21,25,30,36,7,14,11]

问题在于比赛并不是唯一的。最后一句话&#39; as&#39;在#Pas;&#39;中找到了该行,最后一个词是&#39;找不到,因为它被检测为行中的第二个单词,依此类推。

预期输出

MatchesStart = [0,5,8,15,18,22,26,32,38,42,50]
MatchesEnd = [4,7,14,17,21,25,30,36,40,48,52]

请参阅第4,9,10和11条的区别。

如何创建唯一的匹配数列表(从行的开头到结尾)?

更新

请搜索\s\zs\p\w\+

要查找匹配项的开始和结束列,我尝试了match/matchend

匹配=&#39; 31&#39;
matchend =&#39; -1&#39;

Searchpos提供了正确的开始列(32),但它没有给出结束列。
您不能使用matchend来查找结束列,因为起始值错误是导致&#39; \ s&#39;之前&#39; \ zs&#39;

1 个答案:

答案 0 :(得分:1)

使用searchpos()函数搜索您的模式,将其包装在循环中(例如)如果返回列表中的第二个元素为0,则您已在该行上完成搜索。

:h searchpos(阅读详细信息。