Utilisation de l'opérateur = ~

9

Je suis un peu confus sur les opérateurs de comparaison d'expressions rationnelles de VimScript.

Si je regarde à travers :h =~?ma compréhension, cela =~peut être utilisé pour faire une correspondance d'expressions rationnelles (ce ?qui le rend insensible à la casse).

Mais ce code affiche "non":

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

Est-ce que j'utilise =~mal l' opérateur?

Jonathan.Brink
la source

Réponses:

10

Il y a deux problèmes:

  1. Vous en avez besoin \+car vous n'utilisez pas la magie.
  2. Vous utilisez "au lieu de '. Vous devez doubler d'échappement \: \\dou utiliser des guillemets simples.

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

Donc:

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

Cela fonctionne comme prévu.

muru
la source
Ah merci. Donc, je pense que c'est ce que j'allais if s:myVar =~ '\v^S\d+'
Jonathan.Brink
1
@ Jonathan.Brink vous pouvez également virer de bord sur la casse au motif: '\v\c^S\d+'.
muru
agréable. Serait-il préférable d'utiliser=~?
Jonathan.Brink
1
@ Jonathan.Brink Dépend de la façon dont vous comptez l'utiliser. Si vous avez l'intention de réutiliser le modèle (conservez-le dans une variable et faites des tests à plusieurs endroits ou quelque chose), l'utilisation \ccentralisera l'insensibilité à la casse. Utile pour l'organisation du code, sinon je ne pense pas qu'il y ait de différence.
muru