此命令行解析联系人列表文档,该文档可能没有列出电话,电子邮件或网络。如果所有三个都很好,那么一切都很好-将FormatContact()的返回值添加到行的末尾以上传数据:
silent!/^\d/+1|ki|/\n^\d\|\%$/-1|kj|'i,'jd|let @a = substitute(@",'\s*Phone: \([^,]*\)\_.*','\1',"")|let @b = substitute(@",'^\_.*E-mail:\s\[\d*\]\([[email protected]]*\)\_.*','\1',"")|let @c = substitute(@",'^\_.*Web site:\s*\[\d*\]\([-_.:/0-9a-zA-Z]*\)\_.*','\1',"")|?^\d\+?s/$/\=','.FormatContact(@a,@b,@c)
或细分:
silent!/^\d/+1|ki|/\n^\d\|\%$/-1|kj|'i,'jd
let @a = substitute(@",'\s*Phone: \([^,]*\)\_.*','\1',"")
let @b = substitute(@",'^\_.*E-mail:\s\[\d*\]\([[email protected]]*\)\_.*','\1',"")
let @c = substitute(@",'^\_.*Web site:\s*\[\d*\]\([-_.:/0-9a-zA-Z]*\)\_.*','\1',"")
?^\d\+?s/$/\=','.FormatContact(@a,@b,@c)
我创建了三个单独的搜索,以便在一个原子匹配失败的情况下不会使任何一个搜索失败,因为-再次-每个联系人的联系信息可能存在或不存在。
解决方案创建的问题是,当模式不匹配时,我将整个@“放入@a。相反,当不发生匹配时,我需要将其为空。我需要表示的每个变量(电话,电子邮件,网络)是否为空。
而不是使用替换来替换整个捕获的文本凭借其感兴趣的部分,只能匹配该目标部分。不像替换例程,匹配的例程要么找到符合条件的文本更改为给定的模式,或者报告没有这样的文本。从而,优先使用matchstr()
功能而不是substitute()
,问题中列出的解析代码可以如下更改:
仅在需要逐行处理时,请考虑与:global结合使用,例如