Regexps Elisp ^ e $ vs `e '


16

O manual descreve os caracteres especiais regexp ^e $. Como na maioria dos dialetos de expressão regular que eu conheço, eles parecem coincidir com o início ou o fim de uma string. No entanto, também descobri que existem `e 'caracteres disponíveis. Com base na explicação encontrada aqui , eles também parecem coincidir com o início ou o fim das strings. Alguém poderia explicar a diferença entre esses caracteres especiais, com um exemplo e uma recomendação sobre quando usá-los?

Quando olho para o valor de auto-mode-alist, eles parecem ser usados ​​de forma intercambiável para corresponder ao final das strings:

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

2
Quando as pessoas usam $dessa maneira, estão usando nomes de arquivos que não contêm novas linhas. Isso normalmente é uma suposição (muito) segura, mas não é garantida . \\'Portanto, usar é uma prática recomendada.
Phill

Respostas:


14

Sua sequência pode ter um caractere de nova linha incorporado; nesse caso, \'corresponde ao final da sequência, mas $antes do caractere da nova linha.

Para citar o manual Elisp, nó Regexp Special :

Ao combinar uma string em vez de um buffer, `$ 'corresponde no final da string ou antes de um caractere de nova linha.

Da mesma forma, \`corresponde ao início da string, mas ^corresponde logo após o caracter da nova linha. Mais uma vez, o manual:

Ao combinar uma string em vez de um buffer, `^ 'corresponde no início da string ou após um caractere de nova linha.

Portanto, para strings você geralmente deseja usar \`e \', especialmente se seu código não puder saber antecipadamente se pode haver caracteres de nova linha na string. Para texto em um buffer, você normalmente usa ^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 $coincidir com o início e o fim das linhas .

\`e \'coincidir com o início e o fim de toda a cadeia .


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

Caracteres especiais são: . * + ? ^ $ \ [.

Entre parênteses [], também são especiais:] - ^

Muitos caracteres, incluindo backtick `e aspas simples ', tornam-se especiais quando seguem uma barra invertida. Veja aqui para mais detalhes.

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

Há uma diferença entre beginning of string, e beginning of each line in the string.

Cortesia de Ergoemacs. Você pode ler mais aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.