我试图在一行中创建所有匹配的起始列列表和结束列列表。
这就是我所做的:
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;
答案 0 :(得分:1)
使用searchpos()
函数搜索您的模式,将其包装在循环中(例如)如果返回列表中的第二个元素为0,则您已在该行上完成搜索。
:h searchpos(
阅读详细信息。