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