Elisp regexps ^ und $ vs `und '

16

Das Handbuch beschreibt die regulären Sonderzeichen ^und $. Wie in den meisten mir bekannten Dialekten mit regulären Ausdrücken scheinen sie mit dem Anfang oder Ende einer Zeichenfolge übereinzustimmen. Ich habe aber auch festgestellt, dass es `und 'Charaktere gibt. Basierend auf der hier gefundenen Erklärung scheinen sie auch mit dem Anfang oder Ende von Zeichenfolgen übereinzustimmen. Könnte jemand bitte den Unterschied zwischen diesen Sonderzeichen erklären, mit einem Beispiel und einer Empfehlung, wann sie verwendet werden sollen?

Wenn ich mir den Wert von anschaue auto-mode-alist, scheinen sie austauschbar zu sein, um mit dem Ende von Zeichenfolgen übereinzustimmen:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Jackson
quelle
2
Wenn Leute so verwenden $, verlassen sie sich auf Dateinamen, die keine Zeilenumbrüche enthalten. Dies ist normalerweise eine (sehr) sichere Annahme, die jedoch nicht garantiert werden kann . Verwenden \\'ist daher eine bewährte Methode.
PHILS

Antworten:

14

Ihre Zeichenfolge enthält möglicherweise ein eingebettetes Zeilenumbruchzeichen. In diesem Fall \'stimmt die Zeichenfolge mit dem Ende der Zeichenfolge $überein , stimmt jedoch unmittelbar vor dem Zeilenumbruchzeichen überein.

Um es mit dem Elisp Hand Knoten Regexp Spezial :

Bei der Suche nach einem String anstelle eines Puffers steht $ am Ende des Strings oder vor einem Newline-Zeichen.

In ähnlicher Weise \`entspricht den Anfang des Strings, sondern ^entspricht nur nach den Newline - Zeichen. Wieder das Handbuch:

Bei der Suche nach einer Zeichenfolge anstelle eines Puffers wird "^" am Anfang der Zeichenfolge oder nach einem Zeilenumbruchzeichen gesucht.

Für Zeichenfolgen, die Sie im Allgemeinen verwenden möchten, \`und \'insbesondere, wenn Ihr Code nicht im Voraus wissen kann, ob die Zeichenfolge möglicherweise Zeilenumbrüche enthält. Für Text in einem Puffer verwenden Sie normalerweise ^und $.

Drew
quelle
6
(string-match "^foo" "foo")         ; => 0
(string-match "\\`foo" "foo")       ; => 0
(string-match "^foo" "bar\nfoo")    ; => 4
(string-match "\\`foo" "bar\nfoo")  ; => nil

(string-match "foo$" "foo")         ; => 0
(string-match "foo\\'" "foo")       ; => 0
(string-match "foo$" "foo\nbar")    ; => 0
(string-match "foo\\'" "foo\nbar")  ; => nil

^und $passen Sie den Anfang und das Ende der Zeilen an .

\`und \'passen Sie den Anfang und das Ende der gesamten Zeichenfolge an .

Jackson
quelle
2
there are ` and ' characters available. [...] they seem to also match the start or end of strings

Sonderzeichen sind: . * + ? ^ $ \ [.

In Klammern []stehen außerdem folgende Besonderheiten:] - ^

Viele Zeichen, einschließlich Backtick `und einfaches Anführungszeichen ', werden besonders, wenn sie einem Backslash folgen. Sehen Sie hier für weitere Details.

Could someone please explain the difference between these special characters, with an example and recommendation on when to use them?

Es gibt einen Unterschied zwischen beginning of stringund beginning of each line in the string.

Mit freundlicher Genehmigung von Ergoemacs. Sie können hier mehr lesen

Nsukami _
quelle