Эта командная строка анализирует документ со списком контактов, в котором может быть указан телефон, электронная почта или веб-сайт, а может и не быть. Если у него есть все три, то все работает отлично — добавление возврата из 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 пусто?
- Есть ли способ создать необязательный атом, чтобы поисковый запрос (запросы) все еще мог учитывать пустое совпадение, чтобы правильно записать его как пустое?