Vim:如果submatch(1)为空,则删除与模式匹配的文本

问题描述 投票:1回答:2

此命令行解析联系人列表文档,该文档可能没有列出电话,电子邮件或网络。如果所有三个都很好,那么一切都很好-将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。相反,当不发生匹配时,我需要将其为空。我需要表示的每个变量(电话,电子邮件,网络)是否为空。

  1. 我看不到可以在替换函数中设置的标志,将执行此操作。
  2. 如果\ 1为空,是否可以返回“”?
  3. 是否有一种创建可选原子的方法,以便搜索查询仍然可以说明一个空匹配项,以便将其正确记录为空?
regex vim substitution
2个回答
1
投票

而不是使用替换来替换整个捕获的文本凭借其感兴趣的部分,只能匹配该目标部分。不像替换例程,匹配的例程要么找到符合条件的文本更改为给定的模式,或者报告没有这样的文本。从而,优先使用matchstr()功能而不是substitute(),问题中列出的解析代码可以如下更改:


1
投票

仅在需要逐行处理时,请考虑与:global结合使用,例如

© www.soinside.com 2019 - 2024. All rights reserved.