Muitas sintaxes de expressão regular de ferramentas Unix são frequentemente as Expressões regulares básicas e estendidas codificadas em POSIX (BRE e ERE, respectivamente) e, em algumas implementações modernas, no estilo Perl (PCRE é uma implementação disso).
Existe uma correspondência individual entre os níveis de magia de Vim e essas classes definidas externamente, mas bem conhecidas? Parece que \m
é BRE e \v
é ERE, exceto que o POSIX não inclui visões.
Se existe essa correspondência, ela é definida em algum lugar? pattern.txt
tem apenas uma menção de POSIX
.
Ou temos que usar a "mágica" para descrever as expressões regulares do Vim?
regular-expression
muru
fonte
fonte
\v
inclui<>
limites de palavras, que o AFAIK é exclusivo do Vim. Portanto, não, apenas descreva-os como "Vim regex". (Não postar como uma resposta porque eu não sou positivo)Respostas:
Em resumo, não. A expressão regular do Vim é um sabor único e não há opções para fazê-lo se comportar mais como outro sabor.
Eu acho que isso é uma coisa boa.
Magia
A
'magic'
opção não altera o sabor do regex que o Vim usa. Simplesmente inverte o comportamento de muitos\
átomos com escape.Por exemplo, por padrão,
+
é um+
caractere literal , onde\+
significa "um ou mais átomos anteriores". Por outro lado,*
significa "zero ou mais do átomo anterior", enquanto\*
é um literal*
. Muitas pessoas acham isso bastante confuso. Usar\v
seu padrão o torna um pouco mais consistente.:help 'magic'
dá um bom resumo:Pessoalmente, acho que o comportamento padrão é bom para arquivos de código, onde não é incomum procurar coisas como
foo(
, usando o literal(
.O sabor regex do próprio Vim
Testemunhei muitas pessoas desejando que o Vim apoiasse o PCRE. Pessoalmente, desejo que outras ferramentas suportem o sabor da regex do Vim. Possui alguns recursos que são impossíveis ou muito pesados para serem alcançados no PCRE.
Impossível no PCRE
Lookaround é um recurso comum em que você pode afirmar que um padrão corresponde ou não a um parâmetro antes ou depois do padrão que você está tentando corresponder. Por exemplo, o padrão PCRE
q(?!u)
(ou padrão de regex do Vimqu\@!
) corresponde a umq
que não é seguido por au
. (Isso é mais correto queq[^u]
, o que requer que haja algum caractere após oq
.)Lookbehind negativo de comprimento variável
O PCRE e muitos outros sabores têm uma restrição de que um padrão lookbehind negativo deve ter um comprimento fixo. Isso significa que um padrão como
(?<![a-z]{3})foo
, significando "a sequênciafoo
não precedida por exatamente três letras minúsculas") é bom, mas(?<![a-z]+)foo
(significando "a sequênciafoo
não precedida por qualquer número de letras minúsculas") não é.Essa restrição não existe no Vim. No Vim, um padrão como
\([a-z]\+\)\@<!foo
, embora talvez seja um pouco feio de se ver, é perfeitamente válido.Mais fácil no regex do Vim
Algumas coisas são muito melhores no sabor de regex do Vim.
Âncoras no início e no final da partida
O mais notável, na minha opinião, são o
\zs
e\ze
âncoras. Isso permite que você especifique o início e o fim da partida. Por exemplo,foo(\zs.*\ze)
corresponde apenas ao que há entre(
e)
em uma chamada de funçãofoo(...)
. Isso pode ser feito no PCRE, mas requer o uso de lookaround, o que é um pouco tedioso:(?<=foo\().*(?=\))
Correspondência de prefixo
Outra coisa interessante que o Vim pode fazer é corresponder a qualquer prefixo (incluindo o prefixo vazio) de uma sequência específica de caracteres. Por exemplo, para corresponder em
f
,fo
,foo
, oufood
, o padrãof\%[ood]
pode ser utilizado. No PCRE, esse padrão seria semelhantef(o(od?)?)?
. (Imagine isso por uma corda mais longa!)Correspondência de posições de cursor, linha e coluna
A regex do Vim possui algumas âncoras para corresponder às posições no buffer.
\%23c
corresponde à coluna 23\%<23c
corresponde à coluna 23\%>23c
corresponde após a coluna 23\%16l
corresponde à linha 16\%#
corresponde à posição do cursorAcho que vale a pena adotar o sabor da regex de Vim. É adequado para uso em um editor de texto usado principalmente para programação e é bastante poderoso.
fonte