Uso do operador = ~

9

Estou um pouco confuso com os operadores de comparação de expressões regulares do VimScript.

Se eu olhar através do :h =~?meu entendimento, isso =~pode ser usado para fazer uma correspondência de regex (com a ?distinção entre maiúsculas e minúsculas).

Mas esse código imprime "não":

let s:myVar = "S123"
if s:myVar =~? "^S\d+"
  echo "yes"
else
  echo "no"
endif

Estou usando o =~operador incorretamente?

Jonathan.Brink
fonte

Respostas:

10

Existem dois problemas:

  1. Você precisa, \+pois você não está usando magia.
  2. Você está usando em "vez de '. Você precisa dupla de escape \: \\dou usar aspas simples.

    Veja :h literal-string:

    literal-string                                          literal-string E115
    ---------------
    'string'                string constant                 expr-'
    
    Note that single quotes are used.
    
    This string is taken as it is.  No backslashes are removed or have a special
    meaning.  The only exception is that two quotes stand for one quote.
    
    Single quoted strings are useful for patterns, so that backslashes do not need
    to be doubled.  These two commands are equivalent: 
            if a =~ "\\s*"
            if a =~ '\s*'
    

Assim:

let s:myVar = "S123"
if s:myVar =~? '^S\d\+'
  echo "yes"
else
  echo "no"
endif

Isso funciona conforme o esperado.

muru
fonte
Ah obrigada. Então, eu acho que isso é o que eu estava procurando:if s:myVar =~ '\v^S\d+'
Jonathan.Brink
1
@ Jonathan.Brink você também pode orçada em caso insensibilidade para com o padrão: '\v\c^S\d+'.
Muru
agradável. Isso seria preferível ao uso #=~?
JonathanJBrink
1
@ Jonathan.Brink Depende de como você pretende usá-lo. Se você pretende reutilizar o padrão (mantenha-o em uma variável e faça testes em vários locais ou algo assim), o uso \ccentralizará a distinção entre maiúsculas e minúsculas. Útil para organização de código, caso contrário, não acho que haja diferença.
Muru