As mágicas regex do Vim são compatíveis com as classes regex conhecidas?

15

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.txttem apenas uma menção de POSIX.

Ou temos que usar a "mágica" para descrever as expressões regulares do Vim?

muru
fonte
3
Certamente \vinclui <>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)
Doorknob
@ Doorknob, acho que você pode achar interessante essa discussão de respostas como comentários . Como seu comentário tem três votos positivos e nenhum comentário respondendo para dizer que está incorreto, provavelmente está correto (não tenho certeza), mas as edições sugeridas et. al. são impossíveis de melhorar sua precisão. Como uma resposta postada, pode ser editado para maior precisão, upvoted, downvoted, respondeu a, etc.
Wildcard

Respostas:

21

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 \vseu padrão o torna um pouco mais consistente. :help 'magic'dá um bom resumo:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

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 Vim qu\@!) corresponde a um qque não é seguido por a u. (Isso é mais correto que q[^u], o que requer que haja algum caractere após o q.)

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ência foo não precedida por exatamente três letras minúsculas") é bom, mas (?<![a-z]+)foo(significando "a sequência foonã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 \zse \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ção foo(...). 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, ou food, o padrão f\%[ood]pode ser utilizado. No PCRE, esse padrão seria semelhante f(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.


Acho 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.

tommcdo
fonte