繁体   English   中英

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

[英]Vim: Delete the text matching a pattern IF submatch(1) is empty

此命令行解析可能包含或不包含电话、电子邮件或 Web 的联系人列表文档。 如果它具有所有三个,那么一切都很好 - 在行的末尾附加来自 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. 我看不到可以在执行此操作的替换函数中设置的标志。
  2. 如果 \\1 为空,有没有办法返回“”?
  3. 有没有办法创建一个可选的原子,以便搜索查询仍然可以考虑空匹配,以便将其正确记录为空?

以防万一您想要逐行处理,请考虑与 :global 结合使用,例如

let @a=""
g/text to match/let @A=substitute(getline("."), '^.*\(' . @/ . '\).*$', '\1\r', '')

这将为包含它的任何行打印匹配的文本,用换行符分隔:

echo @a

这里的美妙之处在于,您可以非常轻松地使用上次使用的搜索模式

g//let @A=substitute(getline("."), '^.*\(' . @/ . '\).*$', '\1\r', '')

不是使用将整个捕获文本替换为其感兴趣的部分的替换,而是可以仅匹配该目标部分。 与替换例程不同,匹配例程要么定位符合给定模式的文本,要么报告没有这样的文本。 因此,使用matchstr()函数优先于substitute()在问题中列出的解析代码可以如下改变:

let @a = matchstr(@", '\<Phone:\s*\zs[^,]*')
let @b = matchstr(@", '\<E-mail:\s*\[\d*\]\zs[-_@.0-9a-zA-Z]*')
let @c = matchstr(@", '\<Web site:\s*\[\d*\]\zs[-_.:/0-9a-zA-Z]*')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM