Penjelasan contoh alat ekspresi reguler

Oct 19 2020

Membaca ekspresi reguler bagian di EmacsWiki muncul seperti ini:

You can use a tool to construct regexps. For example, you can use ‘rx’ like this:

(rx (or (and "\*" (*? anything) "*/") (and "//" (*? anything) eol)))

To produce this regexp (which matches C-style multiline and single line comments):

\\*\\(?:.\\|\n\\)*?\\*/\\|//\\(?:.\\|\n\\)*?$

Saya mendapatkan surat orwasiat yang cocok dengan komentar baris multiline C-style atau C / C ++.
Tapi saya tidak mendapatkan andbagiannya.

  1. Saya tidak yakin bagaimana cara anythingkerjanya dan saya berasumsi itu akan cocok dengan karakter apa pun.
    Mungkin sesuatu yang setara dengan .*. Apakah itu?

  2. Jika saya melakukannya dengan benar, *?adalah varian *operasi yang tidak serakah .
    Yang benar-benar membuatku bingung ... Pertandingan sekecil mungkin anything?

  3. Mengapa bukaan multi-garis gaya-C ditampilkan sebagai "\ *" ? Saya menduga ini adalah kesalahan ketik pada EmacsWiki dan seharusnya "/ *" .

Jawaban

1 xuchunyang Oct 19 2020 at 19:49

anythingcocok dengan karakter apa pun, sedangkan regexp .cocok dengan karakter apa pun kecuali baris baru, representasi rx-nya adalah not-newline.

*?cocok dengan nol-atau-lebih, tidak serakah. Mari ekstrak komentar dari kode C:

/* comment */ char *s = "*/";
;; * is zero-or-more, greedy
(let ((string "/* comment */ char *s = \"*/\""))
  (when (string-match (rx "/*" (* anything) "*/") string)
    (match-string 0 string)))
;; => "/* comment */ char *s = \"*/"

;; *? is zero-or-more, non-greedy
(let ((string "/* comment */ char *s = \"*/\""))
  (when (string-match (rx "/*" (*? anything) "*/") string)
    (match-string 0 string)))
;; => "/* comment */"

Periksa dokumen melalui Ch f rx atau (info "(elisp) Rx Notation").