Elisp regexps ^ et $ vs `et '

16

Le manuel décrit les caractères spéciaux regexp ^et $. Comme dans la plupart des dialectes d'expression régulière que je connais, ils semblent correspondre au début ou à la fin d'une chaîne. Cependant, j'ai également découvert qu'il existe des personnages `et 'disponibles. Sur la base des explications trouvées ici , elles semblent également correspondre au début ou à la fin des chaînes. Quelqu'un pourrait-il expliquer la différence entre ces caractères spéciaux, avec un exemple et une recommandation sur le moment de les utiliser?

Quand je regarde la valeur de auto-mode-alist, ils semblent être utilisés de manière interchangeable pour correspondre à la fin des chaînes:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Jackson
la source
2
Quand les gens utilisent $comme ça, ils misent sur des noms de fichiers ne contenant pas de nouvelles lignes. Cela va généralement être une hypothèse (très) sûre, mais ce n'est pas garanti . L'utilisation \\'est donc la meilleure pratique.
phils

Réponses:

14

Votre chaîne peut avoir un caractère de nouvelle ligne incorporé, auquel cas \'correspond à la fin de la chaîne mais $correspond juste avant le caractère de nouvelle ligne.

Pour citer le manuel Elisp, node Regexp Special :

Lors de la correspondance d'une chaîne au lieu d'un tampon, `$ 'correspond à la fin de la chaîne ou avant un caractère de nouvelle ligne.

De même, \`correspond au début de la chaîne, mais ^correspond juste après le caractère de nouvelle ligne. Encore une fois, le manuel:

Lors de la correspondance d'une chaîne au lieu d'un tampon, `^ 'correspond au début de la chaîne ou après un caractère de nouvelle ligne.

Donc, pour les chaînes que vous souhaitez généralement utiliser \`et \', surtout si votre code ne peut pas savoir à l'avance s'il peut y avoir des caractères de nouvelle ligne dans la chaîne. Pour le texte dans un tampon, vous utilisez généralement ^et $.

A dessiné
la source
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

^et faire $correspondre le début et la fin des lignes .

\`et faire \'correspondre le début et la fin de la chaîne entière .

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

Les caractères spéciaux sont: . * + ? ^ $ \ [.

Entre parenthèses [], les éléments suivants sont également spéciaux:] - ^

De nombreux personnages, y compris le backtick `et le guillemet simple ', deviennent spéciaux lorsqu'ils suivent une barre oblique inverse. Voir ici pour plus de détails.

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

Il y a une différence entre beginning of string, et beginning of each line in the string.

Avec l'aimable autorisation d'Ergoemacs. Vous pouvez en lire plus ici

Nsukami _
la source