* representa correspondência gananciosa (o maior número possível)
No Vim, você pode usar âncoras de largura zero \zse \zedefinir o início e o fim do padrão pesquisado, com o qual deseja corresponder. Qualquer coisa antes \zse depois \zedo seu padrão não será afetada pela substituição.
Você pode fornecer uma descrição básica do que \zsfaz em sua resposta?
EvergreenTree
3
Vale a pena notar que a razão pela qual isso funciona é porque .*é ganancioso .
Curinga
7
Você pode procurar a última correspondência agrupando tudo \(.*\), mas a última ocorrência de pattern. Em seguida, sair com o grupo capturado \1e adicionar o replacement.
(Isso é inferior à \zssolução de @ ryuichiro , em que sua \1abordagem é funcionalmente equivalente, mas mais detalhada. (Por outro lado, pode ser mais fácil lembrar de alguns, principalmente se eles estiverem acostumados a outros tipos de expressões regulares))
Aaron Thoma
0
Por uma questão de integridade, pensei em publicar uma alternativa. O Vim possui vários itens, alguns dos quais são semelhantes às asserções de busca padrão de expressões regulares mais comuns ( procura negativa / positiva / procura por trás). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
Nesse caso, queremos um lookahead negativo \@!, o que significa que queremos afirmar que o átomo que precede o item não ocorre após o padrão . Nesse caso, o átomo é o próprio padrão precedido por qualquer outra coisa:
:%s/pattern\(.*pattern\)\@!/replacement/
A parte entre parênteses é de largura zero e não está incluída na partida, portanto não é substituída pela substituição.
:h \@!para obter mais informações ou :h pattern-multi-itemspara toda a seção que contém outras variações de aparência.
\zs
faz em sua resposta?.*
é ganancioso .Você pode procurar a última correspondência agrupando tudo
\(.*\)
, mas a última ocorrência depattern
. Em seguida, sair com o grupo capturado\1
e adicionar oreplacement
.fonte
\zs
solução de @ ryuichiro , em que sua\1
abordagem é funcionalmente equivalente, mas mais detalhada. (Por outro lado, pode ser mais fácil lembrar de alguns, principalmente se eles estiverem acostumados a outros tipos de expressões regulares))Por uma questão de integridade, pensei em publicar uma alternativa. O Vim possui vários itens, alguns dos quais são semelhantes às asserções de busca padrão de expressões regulares mais comuns ( procura negativa / positiva / procura por trás). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
Nesse caso, queremos um lookahead negativo
\@!
, o que significa que queremos afirmar que o átomo que precede o item não ocorre após o padrão . Nesse caso, o átomo é o próprio padrão precedido por qualquer outra coisa:A parte entre parênteses é de largura zero e não está incluída na partida, portanto não é substituída pela substituição.
:h \@!
para obter mais informações ou:h pattern-multi-items
para toda a seção que contém outras variações de aparência.fonte