Beispiel für ein Tool für reguläre Ausdrücke

Oct 19 2020

Das Lesen des Abschnitts reguläre Ausdrücke in EmacsWiki sieht folgendermaßen aus :

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

Ich erhalte die orÜbereinstimmung entweder mit mehrzeiligen C-Stil- oder einzeiligen C / C ++ - Kommentaren.
Aber ich bekomme die andTeile nicht.

  1. Ich bin mir nicht sicher, wie es anythingfunktioniert und gehe davon aus, dass es zu jedem Zeichen passt.
    Es könnte etwas Äquivalentes sein .*. Ist es?

  2. Wenn ich es richtig verstanden habe, *?ist die nicht gierige Variante der *Operation.
    Was mich wirklich verwirrt ... Die kleinstmögliche Übereinstimmung für anything?

  3. Warum wird die mehrzeilige Öffnung im C-Stil als "\ *" angezeigt ? Ich vermute, es ist ein Tippfehler in EmacsWiki und es sollte "/ *" sein .

Antworten

1 xuchunyang Oct 19 2020 at 19:49

anythingEntspricht .einem beliebigen Zeichen, während regulärer Ausdruck mit einem beliebigen Zeichen außer einem Zeilenumbruch übereinstimmt, lautet die Empfangsdarstellung not-newline.

*?entspricht null oder mehr, nicht gierig. Lassen Sie uns einen Kommentar aus dem C-Code extrahieren:

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

Überprüfen Sie das Dokument über Ch f rx oder (info "(elisp) Rx Notation").