Elisp regexps ^ e $ vs `and '


16

Il manuale descrive i caratteri speciali di regexp ^e $. Come nella maggior parte dei dialetti delle espressioni regolari che conosco, sembrano corrispondere all'inizio o alla fine di una stringa. Tuttavia, ho anche scoperto che ci sono `e 'personaggi disponibili. Sulla base della spiegazione trovata qui , sembrano corrispondere anche all'inizio o alla fine delle stringhe. Qualcuno potrebbe spiegare la differenza tra questi caratteri speciali, con un esempio e una raccomandazione su quando usarli?

Quando guardo il valore di auto-mode-alist, sembrano essere usati in modo intercambiabile per abbinare la fine delle stringhe:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)

2
Quando le persone usano $così, puntano su nomi di file che non contengono newline. Questo in genere sarà un presupposto (molto) sicuro, ma non è garantito . L'uso \\'è quindi la migliore pratica.
phils,

Risposte:


14

La stringa potrebbe avere un carattere di nuova riga incorporato, nel qual caso \'corrisponde alla fine della stringa ma $corrisponde appena prima del carattere di nuova riga.

Per citare il manuale di Elisp, nodo Regexp Special :

Quando si abbina una stringa anziché un buffer, `$ 'corrisponde alla fine della stringa o prima di un carattere di nuova riga.

Allo stesso modo, \`corrisponde all'inizio della stringa, ma ^corrisponde subito dopo il carattere di nuova riga. Ancora una volta, il manuale:

Quando si abbina una stringa invece di un buffer, `^ 'corrisponde all'inizio della stringa o dopo un carattere di nuova riga.

Pertanto, per le stringhe che si desidera generalmente utilizzare \`e \', soprattutto se il codice non è in grado di sapere in anticipo se nella stringa potrebbero esserci caratteri di nuova riga. Per il testo in un buffer in genere si utilizza ^e $.


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

^e $abbina l'inizio e la fine delle righe .

\`e \'abbina l'inizio e la fine dell'intera stringa .


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

I caratteri speciali sono: . * + ? ^ $ \ [.

Tra parentesi [], anche le seguenti sono speciali:] - ^

Molti personaggi tra cui backtick `e virgoletta singola 'diventano speciali quando seguono una barra rovesciata. Vedi qui per maggiori dettagli.

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

C'è una differenza tra beginning of string, e beginning of each line in the string.

Per gentile concessione di Ergoemacs. Puoi leggere di più qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.