Diferença entre \ A \ z e ^ $ nas expressões regulares do Ruby

Na documentação eu li:

Use \ A e \ z para corresponder ao início e ao final da string, e ^ corresponder ao início / fim de uma linha.

Vou aplicar uma expressão regular para verificar o nome de usuário (ou e-mail é o mesmo) enviado pelo usuário. Qual expressão devo usar com validates_format_of no modelo? Não entendo a diferença: sempre usei ^ e $ …

Se você estiver dependendo da expressão regular para validação, sempre deseje usar \A e \z . ^ e $ só serão compatíveis até um caractere de nova linha, o que significa que eles podem usar um e-mail como me@example.com\n e ainda validá-lo, pois o regex só vê tudo antes do \n .

Minha recomendação seria apenas descartar completamente novas linhas de um nome de usuário ou e-mail de antemão, já que praticamente não há razão legítima para uma. Em seguida, você pode usar com segurança OU \A \z \A \z ou ^ $ .

De acordo com Pickaxe :

^ Corresponde ao começo de uma linha.

$ Corresponde ao final de uma linha.

\A Corresponde ao início da string.

\z Corresponde ao final da string.

\Z Corresponde ao final da string, a menos que a string termine com um "\n" . Nesse caso, ela corresponde exatamente antes do "\n" .

Então, use \A e \z minúsculas. Se você usar \Z alguém poderá entrar em um personagem de nova linha. Isso não é perigoso, mas pode atrapalhar algoritmos que presumem que não há espaço em branco na string. Dependendo das suas restrições de regex e comprimento de string, alguém poderia usar um nome invisível com apenas um caractere de nova linha.

A implementação do JavaScript do Regex trata \A como um literal 'A' ( ref ). Então fique atento e teste.

O início e o final de uma string podem não ser necessariamente a mesma coisa que o início e o fim de uma linha. Imagine se você usasse o seguinte como sua string de teste:

meu
nome
é
Andrew

Observe que a string tem muitas linhas – os caracteres ^ e $ permitem combinar o início e o final dessas linhas (basicamente tratando o caractere \n como um delimitador) enquanto \A e \Z permitem que você combine o início e o final fim de toda a cadeia.

Diferença Por Exemplo

  1. /^foo$/ corresponde a qualquer um dos seguintes, /\Afoo\z/ não:
 whatever1 foo whatever2 
 foo whatever2 
 whatever1 foo 
  1. /^foo$/ e /\Afoo\z/ all correspondem ao seguinte:
 foo