2012-01-11 55 views
1

此命令行解析可能包含或不包含电话,电子邮件或Web列表的联系人列表文档。如果它有三个那么一切的伟大工程 - 在数据上载该行的末尾附加从FormatContact()的返回:VIM:删除模式IF子匹配(1)为空

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) 

我创建了三个单独的搜索,以避免任何ONE搜索失败,如果一个原子未能匹配,因为 - 再次 - 联系信息可能或可能不存在每个联系人。

的问题创建的解决方案是,当模式不匹配,我得到了整个@”到@a。相反,我需要的是在比赛时不会出现空。我需要代表每一个变量(电话,电子邮件,网络),无论是空的。

  1. 我看不出有任何的标志,可以在替代函数来设置 会做到这一点。
  2. 有没有一种方式,如果\返回“” 1是空的吗?
  3. 有没有办法创建一个可选的原子,所以搜索查询(IES)仍然可以解释为空的匹配,以便正确记录它为空?
+0

你能说清楚一下你想做什么吗?你是否正在处理输入?谁首先放​​弃了选择? @a将在哪里使用。 (_我尽我最大的努力使这件事变得简洁,但是写了一个vimscript函数,对我来说没有任何效果) – sehe 2012-01-11 16:30:20

+0

@sehe帖子已更新。 – Ricalsin 2012-01-12 00:36:43

回答

1

而不是使用替代,随着其更换整个捕获文本210感兴趣的部分,只能匹配那个目标部分。与替代 例程不同,匹配的或者定位文本遵循给定模式,或者报告 没有这样的文本。因此,使用matchstr()优先于 substitute(),问题中列出的解析代码可以被转换,如 所示。

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

古鲁@ib。你真令人惊叹! :)我实际上是通过使用从我学到的另一种技术(“FormatContact”函数中的“!=”匹配词)来解决这个问题的,但我知道有一种更好的方法 - 我实现了您的上述文章。我想我在vim的帮助下阅读了关于matchstr的内容,但要记住这一切太过分了。再次感谢你)。 – Ricalsin 2012-01-12 17:14:25

+0

古鲁@ib。你对我的帮助很大。我回来了更多! :)你能看看这篇文章吗? http://stackoverflow.com/questions/8887207/screen-scraping-automating-a-vim-script谢谢! – Ricalsin 2012-01-16 22:35:05

+0

我收到了你的电子邮件。谢谢你追我!私下回应。截至今日,您应该从我的Gmail帐户收到我的电子邮件。 – Ricalsin 2012-01-18 15:41:42

1

为了防止您需要逐行处理,请考虑与以下内容结合使用:global,例如,

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

这将打印包含任何线,用换行分隔匹配文本:

echo @a 

这里的美丽的东西,就是你可以把它与上次使用搜索工作-pattern很容易:

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

谢谢@sehe这是创造性思维,我会记住。我根据您的要求转发了OP,使其更清晰。请再看一下。谢谢! – Ricalsin 2012-01-11 20:14:27