Почему ex (vim) перехватывает соответствующий шаблон до конца строки

Файл содержит следующую строку:

[assembly: AssemblyVersion("1.0.0.0")]

Скрипт Bash, который заменяет одну версию на другую:

echo "%s/AssemblyVersion\s*\(.*\)/AssemblyVersion(\"$newVersionNumber\")]/g
        w
        q
        " | ex $filePath

Вопрос в том, почему это цепляет всю строку до конца, поэтому я должен добавить ] в конце строки замены?

1 ответ

Решение

Проблема возникает потому, что .* сопоставляет все символы до конца строки и \( а также \) создать группу захвата (в отличие от большинства двигателей регулярных выражений NFA, регулярное выражение Vim соответствует ( полукокса с укрытием ( а также ) с неуправляемым ) в шаблоне).

Вы можете использовать

%s/AssemblyVersion\s*([^()]*)/AssemblyVersion(\"$newVersionNumber\")/g

Вот, AssemblyVersion будет соответствовать слову, то \s* будет соответствовать любым 0+ пробелам, ( будет соответствовать буквальному (, [^()]* будет соответствовать 0+ символов кроме ( а также ), а также ) будет соответствовать буквальному ),

Другая команда подстановки регулярных выражений, которую вы можете использовать:

:%s/AssemblyVersion\s*(\zs[^()]*\ze)/\"$newVersionNumber\"/g

Вот, AssemblyVersion\s*( будет соответствовать AssemblyVersion, 0+ пробелов и ( а также \zs пропустит эту часть в матче, затем 0+ символов кроме ( а также ) будет соответствовать, а затем \ze) проверим есть ли ) справа от текущего местоположения, но не добавит его в матч.

\zs устанавливает следующий символ в качестве первого символа матча. Любой текст перед \zs шаблон не будет включен в матч.

\ze устанавливает конец матча. Что-нибудь после \zs шаблон не будет частью матча.

Другие вопросы по тегам