2012-01-11 32 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