Regex no Vi: Como usar classes de caracteres dentro de grupos? (por exemplo, [\ s \ w])


15

No Vim, a classe de caractere \scorresponde a qualquer caractere de espaço em branco. Quando estou usando esses caracteres especiais em grupos, por exemplo, [\s\w]ele não corresponde a nenhum espaço em branco ou caractere de palavra, ele corresponde a sou w.

Como alguém usa classes de caracteres dentro de grupos?


8
Ao contrário de algumas implementações de mecanismos de expressão regular, o Vim não parece suportar essa notação. [[:space:][:alnum:]_]pode ser usado para aproximar a coleção de \se \w, no entanto.
— Peter Lewerin

@ PeterLewerin Por favor, poste isso como resposta.
— Christopher Bottoms

@ChristopherBottoms: pronto.
— precisa saber é o seguinte

Respostas:


11

Isso não é um grupo, é um intervalo, e no Vim você não pode usar classes de caracteres (embora isso seja possível em outras implementações de regex, por exemplo, em python ). Você precisará usar uma alternância :

/\(\w\|\s\)

ou:

/\v(\s|\w)

(ou, a solução proposta por Peter Lewerin ).


2
Só porque se pode construir um intervalo inválido em uma classe de caracteres não significa que não deve ser possível usar algo como \sem uma classe de caracteres. Por acaso, a implementação de regex do Vim fez essa escolha, mas outras implementações permitem que você o use [\s].
— 31715 jamessan

@VanLaser Se você editar a resposta com essas informações ([\ s] é uma possibilidade em outras implementações de regex, mas não no vim), aceitarei sua resposta!
— John HK

(tudo bem, adicionado)
— VanLaser

11

Ao contrário de algumas implementações de mecanismos de expressão regular, o Vim não parece suportar essa notação ( [\s\w]) nas coleções. Porém, pode-se usar expressões de classe de caracteres POSIX .

  • [:blank:]é o mesmo que \s.
  • [:space:]corresponde a um número maior de caracteres de espaço em branco do \sque e parece ser equivalente a \_s.
  • [:alnum:]aproxima \w, mas não corresponde ao sublinhado ( _).

Portanto, a coleção que você queria poderia ser escrita como [[:blank:][:alnum:]_]ou [[:space:][:alnum:]_].

Eu não tenho verificado isso por meio de testes, mas está documentado no :h regexp, :h /character-classese :h /collection.

Nota sobre portabilidade: em outros mecanismos regex, \snormalmente é o mesmo que [:space:](ou \_s) no Vim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.