Penjelasan contoh alat ekspresi reguler
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.
Saya tidak yakin bagaimana cara
anythingkerjanya dan saya berasumsi itu akan cocok dengan karakter apa pun.
Mungkin sesuatu yang setara dengan.*. Apakah itu?Jika saya melakukannya dengan benar,
*?adalah varian*operasi yang tidak serakah .
Yang benar-benar membuatku bingung ... Pertandingan sekecil mungkinanything?Mengapa bukaan multi-garis gaya-C ditampilkan sebagai "\ *" ? Saya menduga ini adalah kesalahan ketik pada EmacsWiki dan seharusnya "/ *" .
Jawaban
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").