Diferencia entre \ A \ z y ^ $ en expresiones regulares de Ruby

En la documentación que leo:

Use \ A y \ z para hacer coincidir el inicio y el final de la cadena, ^ y $ coincida con el inicio / final de una línea.

Voy a aplicar una expresión regular para verificar el nombre de usuario (o el correo electrónico es el mismo) enviado por el usuario. ¿Qué expresión debo usar con validates_format_of en el modelo? No puedo entender la diferencia: siempre he usado ^ y $ …

Si depende de la expresión regular para la validación, siempre quiere usar \A y \z . ^ y $ solo coincidirán hasta un carácter de nueva línea, lo que significa que podrían usar un correo electrónico como me@example.com\n y aún así tenerlo validado, ya que la expresión regular solo lo ve todo antes del \n .

Mi recomendación sería simplemente desvincular completamente nuevas líneas de un nombre de usuario o correo electrónico de antemano, ya que no hay una razón legítima para una. Entonces puede usar sin peligro \A \z o ^ $ .

De acuerdo con Pickaxe :

^ Coincide con el comienzo de una línea.

$ Coincide con el final de una línea.

\A coincide con el comienzo de la cadena.

\z Coincide con el final de la cadena.

\Z Coincide con el final de la cadena a menos que la cadena termine con "\n" , en cuyo caso coincide justo antes de "\n" .

Por lo tanto, use \A y minúsculas \z . Si usa \Z alguien podría colarse en un carácter de nueva línea. Esto no es peligroso, creo, pero podría arruinar algoritmos que supongan que no hay espacios en blanco en la cadena. Dependiendo de sus expresiones regex y longitud de cadena, alguien podría usar un nombre invisible con solo un carácter de nueva línea.

La implementación de JavaScript de Regex trata \A como literal 'A' ( ref ). Así que ten cuidado y prueba.

El inicio y el final de una cadena pueden no ser necesariamente lo mismo que el inicio y el final de una línea. Imagine si utilizó lo siguiente como su cadena de prueba:

mi
nombre
es
Andrés

Observe que la cadena tiene muchas líneas: los caracteres ^ y $ permiten hacer coincidir el principio y el final de esas líneas (básicamente tratando el carácter \n como un delímetro), mientras que \A y \Z permiten hacer coincidir el principio y el fin de toda la cadena.

Diferencia por ejemplo

  1. /^foo$/ coincide con cualquiera de los siguientes, /\Afoo\z/ does not:
 whatever1 foo whatever2 
 foo whatever2 
 whatever1 foo 
  1. /^foo$/ y /\Afoo\z/ all coinciden con lo siguiente:
 foo