Beispiel für ein Tool für reguläre Ausdrücke
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.
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?Wenn ich es richtig verstanden habe,
*?ist die nicht gierige Variante der*Operation.
Was mich wirklich verwirrt ... Die kleinstmögliche Übereinstimmung füranything?Warum wird die mehrzeilige Öffnung im C-Stil als "\ *" angezeigt ? Ich vermute, es ist ein Tippfehler in EmacsWiki und es sollte "/ *" sein .
Antworten
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").