In der Dokumentation habe ich gelesen:
Verwenden Sie \ A und \ z, um den Anfang und das Ende der Zeichenfolge abzugleichen, ^ und $ stimmen mit dem Anfang / Ende einer Zeile überein.
Ich werde einen regulären Ausdruck anwenden, um den vom Benutzer übermittelten Benutzernamen (oder die gleiche E-Mail-Adresse) zu überprüfen. Mit welchem Ausdruck soll ich validates_format_of
im Modell verwenden? Ich kann den Unterschied nicht verstehen: Ich habe immer ^ und $ ...
Antworten:
Wenn Sie zur Validierung auf den regulären Ausdruck angewiesen sind, möchten Sie immer
\A
und verwenden\z
.^
und$
wird nur bis zu einem Zeilenumbruchzeichen übereinstimmen, was bedeutet, dass sie eine E-Mail wie verwenden[email protected]\n<script>dangerous_stuff();</script>
und sie trotzdem validieren lassen können, da der reguläre Ausdruck nur alles vor dem sieht\n
.Meine Empfehlung wäre, vorher nur neue Zeilen von einem Benutzernamen oder einer E-Mail zu entfernen, da es so gut wie keinen legitimen Grund dafür gibt. Dann können Sie
\A
\z
entweder oder verwenden^
$
.quelle
\z
statt sein\Z
!$
stattdessen nach "Ende der Zeichenfolge" suchen würden\z
.Laut Pickaxe :
Verwenden Sie also
\A
Kleinbuchstaben\z
. Wenn Sie\Z
jemanden verwenden , könnte sich ein Zeilenumbruchzeichen einschleichen. Dies ist meiner Meinung nach nicht gefährlich, könnte aber Algorithmen vermasseln, die davon ausgehen, dass die Zeichenfolge kein Leerzeichen enthält. Abhängig von Ihren Einschränkungen hinsichtlich Regex und Zeichenfolgenlänge kann jemand einen unsichtbaren Namen mit nur einem Zeilenumbruchzeichen verwenden.Die JavaScript-Implementierung von Regex wird
\A
als Literal'A'
( ref ) behandelt. Also pass auf dich auf und teste.quelle
Der Anfang und das Ende einer Zeichenfolge müssen nicht unbedingt mit dem Anfang und dem Ende einer Zeile identisch sein. Stellen Sie sich vor, Sie hätten Folgendes als Testzeichenfolge verwendet:
Beachten Sie, dass die Zeichenfolge hat viele Linien in ihm - das
^
und$
Zeichen können Sie den Anfang und das Ende dieser Zeilen entsprechen (im Wesentlichen die Behandlung von\n
Zeichen als Trennzeichen) , während\A
und\Z
ermöglicht es Ihnen , den Anfang und das Ende des gesamten Strings entsprechen.quelle
Unterschied durch Beispiel
/^foo$/
stimmt mit einer der folgenden/\Afoo\z/
Aussagen überein, nicht:/^foo$/
und/\Afoo\z/
alle stimmen mit folgenden überein:quelle