Elisp regexps ^ y $ vs `y '

16

El manual describe los caracteres especiales regexp ^y $. Como en la mayoría de los dialectos de expresiones regulares que conozco, parecen coincidir con el inicio o el final de una cadena. Sin embargo, también he descubierto que hay `y 'personajes disponibles. Según la explicación que se encuentra aquí , también parecen coincidir con el inicio o el final de las cadenas. ¿Podría alguien explicar la diferencia entre estos caracteres especiales, con un ejemplo y una recomendación sobre cuándo usarlos?

Cuando miro el valor de auto-mode-alist, parece que se usan indistintamente para coincidir con el final de las cadenas:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Jackson
fuente
2
Cuando las personas usan $así, apuestan por nombres de archivo que no contienen líneas nuevas. Esto normalmente será una suposición (muy) segura, pero no está garantizada . \\'Por lo tanto, el uso es la mejor práctica.
phils

Respuestas:

14

Su cadena puede tener un carácter de nueva línea incrustado, en cuyo caso \'coincide con el final de la cadena pero $coincide justo antes del carácter de nueva línea.

Para citar el manual de Elisp, nodo Regexp Special :

Al hacer coincidir una cadena en lugar de un búfer, '$' coincide al final de la cadena o antes de un carácter de nueva línea.

Del mismo modo, \`coincide con el comienzo de la cadena, pero ^coincide justo después del carácter de nueva línea. De nuevo, el manual:

Al hacer coincidir una cadena en lugar de un búfer, `^ 'coincide al comienzo de la cadena o después de un carácter de nueva línea.

Entonces, para las cadenas que generalmente desea usar \`y \', especialmente si su código no puede saber de antemano si puede haber caracteres de nueva línea en la cadena. Para el texto en un búfer, normalmente usa ^y $.

Dibujó
fuente
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

^y hacer $coincidir el inicio y el final de las líneas .

\`y \'coincide con el inicio y el final de toda la cadena .

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

Los caracteres especiales son: . * + ? ^ $ \ [.

Entre paréntesis [], los siguientes también son especiales:] - ^

Muchos caracteres, entre los que se incluyen la barra invertida 'y la comilla simple', se vuelven especiales cuando siguen una barra invertida. Ver aquí para más detalles.

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

Hay una diferencia entre beginning of stringy beginning of each line in the string.

Cortesía de Ergoemacs. Puedes leer más aquí

Nsukami _
fuente