Verwendung des Operators = ~

9

Ich bin ein wenig verwirrt über die Regex-Vergleichsoperatoren von VimScript.

Wenn ich mir :h =~?mein Verständnis anschaue , =~kann dies verwendet werden, um ein Regex-Match durchzuführen (wobei die ?Groß- und Kleinschreibung nicht berücksichtigt wird).

Aber dieser Code gibt "nein" aus:

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

Benutze ich den =~Operator falsch?

Jonathan.Brink
quelle

Antworten:

10

Es gibt zwei Probleme:

  1. Sie brauchen, \+da Sie keine Magie verwenden.
  2. Sie verwenden "anstelle von '. Sie müssen die Escape-Anweisung verdoppeln \: \\doder einfache Anführungszeichen verwenden.

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

Damit:

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

Dies funktioniert wie erwartet.

muru
quelle
Ah danke. Also, ich denke, das ist, was ich wollte:if s:myVar =~ '\v^S\d+'
Jonathan.Brink
1
@ Jonathan.Brink können Sie auch die Groß- und Kleinschreibung gegenüber dem Muster angehen : '\v\c^S\d+'.
Muru
nett. Wäre das vorzuziehen=~?
Jonathan.Brink
1
@ Jonathan.Brink Hängt davon ab, wie Sie es verwenden möchten. Wenn Sie beabsichtigen, das Muster wiederzuverwenden (behalten Sie es in einer Variablen und führen Sie Tests an mehreren Stellen oder so etwas durch), \cwird durch die Verwendung die Groß- und Kleinschreibung nicht berücksichtigt . Nützlich für die Code-Organisation, sonst glaube ich nicht, dass es einen Unterschied gibt.
Muru