Cách sử dụng toán tử = ~


9

Tôi hơi bối rối về các toán tử so sánh regex của VimScript.

Nếu tôi xem qua :h =~?sự hiểu biết của tôi là =~có thể được sử dụng để thực hiện một trận đấu regex (với việc ?làm cho nó không phân biệt chữ hoa chữ thường).

Nhưng mã này in "không":

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

Tôi đang sử dụng =~toán tử không chính xác?

Câu trả lời:


10

Có hai vấn đề:

  1. Bạn cần \+vì bạn không sử dụng phép thuật.
  2. Bạn đang sử dụng "thay vì '. Bạn cần tăng gấp đôi thoát \: \\d, hoặc sử dụng dấu ngoặc đơn.

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

Vì thế:

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

Điều này hoạt động như mong đợi.


À, cảm ơn. Vì vậy, tôi nghĩ rằng đây là những gì tôi sẽ theo đuổi:if s:myVar =~ '\v^S\d+'
Jonathan.Brink

1
@ Jonathan.Brink bạn cũng có thể giải quyết trường hợp không nhạy cảm với mẫu : '\v\c^S\d+'.
muru

đẹp. Điều đó có thích hợp hơn để sử dụng=~?
Jonathan.Brink

1
@ Jonathan.Brink Phụ thuộc vào cách bạn định sử dụng nó. Nếu bạn có ý định sử dụng lại mẫu (giữ nó trong một biến và thực hiện các thử nghiệm ở nhiều nơi hoặc một cái gì đó), việc sử dụng \csẽ tập trung vào tính không nhạy cảm của trường hợp. Hữu ích cho tổ chức mã, nếu không tôi không nghĩ có sự khác biệt.
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.