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?

John HK
fonte
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 ).

VanLaser
fonte
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.

Peter Lewerin
fonte