Почему ex (vim) перехватывает соответствующий шаблон до конца строки - PullRequest
0 голосов
/ 28 сентября 2018

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

[assembly: AssemblyVersion("1.0.0.0")]

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

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

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

1 Ответ

0 голосов
/ 28 сентября 2018

Проблема возникает потому, что .* сопоставляет все символы до конца строки, а \( и \) создают группу захвата (в отличие от большинства механизмов регулярных выражений 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, не будет частью матча.

...