Uso del operador = ~

9

Estoy un poco confundido con los operadores de comparación de expresiones regulares de VimScript.

Si miro a través de :h =~?mi comprensión, es que =~se puede usar para hacer una coincidencia de expresiones regulares (con la ?diferencia entre mayúsculas y minúsculas).

Pero este código imprime "no":

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

¿Estoy usando el =~operador incorrectamente?

Jonathan.Brink
fuente

Respuestas:

10

Hay dos problemas:

  1. Necesitas \+ya que no estás usando magia.
  2. Estás usando en "lugar de '. Necesitas doble escape \: \\do usar comillas simples.

    Ver :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*'
    

Entonces:

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

Esto funciona como se esperaba.

muru
fuente
Ah gracias. Entonces, creo que esto es lo que estaba buscando:if s:myVar =~ '\v^S\d+'
Jonathan.Brink
1
@ Jonathan.Brink también se puede virar en caso de falta de sensibilidad al patrón: '\v\c^S\d+'.
muru
bonito. ¿Sería preferible usarlo=~?
Jonathan.Brink
1
@ Jonathan.Brink Depende de cómo pretendas usarlo. Si tiene la intención de reutilizar el patrón (manténgalo en una variable y realice pruebas en varios lugares o algo así), el uso \ccentralizará la insensibilidad a mayúsculas y minúsculas. Útil para la organización del código, de lo contrario no creo que haya una diferencia.
muru