Penggunaan operator = ~

9

Saya sedikit bingung dengan operator perbandingan regex VimScript.

Jika saya melihat melalui :h =~?pemahaman saya adalah yang =~dapat digunakan untuk melakukan pertandingan regex (dengan ?membuatnya case-sensitive).

Tetapi kode ini mencetak "tidak":

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

Apakah saya salah menggunakan =~operator?

Jonathan. Minumlah
sumber

Jawaban:

10

Ada dua masalah:

  1. Anda perlu \+karena Anda tidak menggunakan sihir.
  2. Anda menggunakan "bukan '. Anda harus meloloskan diri \:: \\d, atau menggunakan tanda kutip tunggal.

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

Begitu:

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

Ini berfungsi seperti yang diharapkan.

muru
sumber
Ah terima kasih. Jadi, saya pikir inilah yang saya kejar:if s:myVar =~ '\v^S\d+'
Jonathan.
1
@ Jonathan.Brink Anda juga dapat taktik pada kasus ketidakpekaan terhadap pola: '\v\c^S\d+'.
muru
bagus. Apakah itu lebih baik daripada menggunakan=~?
Jonathan.
1
@ Jonathan.Brink Tergantung pada bagaimana Anda bermaksud menggunakannya. Jika Anda berniat untuk menggunakan kembali pola (simpan dalam variabel, dan lakukan tes di banyak tempat atau sesuatu), menggunakan \cakan memusatkan ketidaksensitifan huruf besar-kecil. Berguna untuk organisasi kode, kalau tidak saya tidak berpikir ada perbedaan.
muru