Normal ifadeler aracı örnek açıklaması

Oct 19 2020

EmacsWiki'de bölüm normal ifadeleri okunduğunda şu görünür:

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\\)*?$

Elde orC tarzı satırlı veya C / C ++ tek satır bir yorum ya eşleşir.
Ama andparçaları alamıyorum .

  1. Nasıl anythingçalıştığından emin değilim ve bunun herhangi bir karakterle eşleşeceğini varsayıyorum.
    Eşdeğer bir şey olabilir .*. Bu mu?

  2. Doğru *?anladıysam, *operasyonun açgözlü olmayan çeşidi .
    Bu gerçekten kafamı karıştırıyor ... Mümkün olan en küçük eşleşme anything?

  3. C tarzı çok satırlı açılış neden "\ *" olarak gösteriliyor ? EmacsWiki'de bir yazım hatası olduğundan şüpheleniyorum ve "/ *" olmalı .

Yanıtlar

1 xuchunyang Oct 19 2020 at 19:49

anythingregexp .herhangi bir karakterle eşleşirken, yeni satır dışında herhangi bir karakterle eşleşir , rx temsili not-newline.

*?açgözlü olmayan, sıfır veya daha fazla ile eşleşir. C kodundan yorum çıkaralım:

/* 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 */"

Belgeyi Ch f rx veya (info "(elisp) Rx Notation") aracılığıyla kontrol edin.