【发布时间】:2020-02-22 15:23:03
【问题描述】:
此命令行解析联系人列表文档,该文档可能列出也可能没有列出电话、电子邮件或网络。如果它具有所有三个,那么一切都很好 - 将来自 FormatContact() 的返回附加到数据上传的行尾:
silent!/^\d/+1|ki|/\n^\d\|\%$/-1|kj|'i,'jd|let @a = substitute(@",'\s*Phone: \([^,]*\)\_.*','\1',"")|let @b = substitute(@",'^\_.*E-mail:\s\[\d*\]\([-_@.0-9a-zA-Z]*\)\_.*','\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*\]\([-_@.0-9a-zA-Z]*\)\_.*','\1',"")
let @c = substitute(@",'^\_.*Web site:\s*\[\d*\]\([-_.:/0-9a-zA-Z]*\)\_.*','\1',"")
?^\d\+?s/$/\=','.FormatContact(@a,@b,@c)
我创建了三个单独的搜索,以便在一个原子匹配失败时不会使任何一次搜索失败,因为 - 再次 - 每个联系人可能存在或可能不存在联系信息。
问题该解决方案创建的是,当模式不匹配时,我将整个 @" 放入 @a。相反,当匹配不发生时,我需要它为空。我需要每个变量都表示(电话、电子邮件、网络),无论它是否为空。
- 我看不到可以在替换函数中设置的标志 会这样做。
- 如果 \1 为空,有没有办法返回 ""?
- 有没有办法创建一个可选原子,以便搜索查询仍然可以解释一个空匹配,从而正确地将其记录为空?
【问题讨论】:
-
你能把你想要做什么更清楚一点吗?您是否正在逐行处理输入?谁首先拉动选择? @a 将在哪里使用。 (我尽我所能从中得到一些简洁的东西,但是没有编写一个 vimscript 函数对我来说没有任何效果)
-
@sehe 帖子已更新。
标签: regex vim substitution