Ruby正規表現の\ A \ zと^ $の違い


196

私が読んだドキュメントでは:

\ Aと\ zを使用して文字列の開始と終了を一致させ、^と$を行の開始/終了と一致させます。

正規表現を適用して、ユーザーが送信したユーザー名(または電子メールは同じ)を確認します。validates_format_ofモデルでどの式を使用する必要がありますか?違いがわかりません。^と$をいつも使ってきました...


回答:


226

検証に正規表現に依存している場合は、常に\Aand を使用する必要があり\zます。^そして正規表現$は改行文字までしか一致しません。つまりme@example.com\n<script>dangerous_stuff();</script>、正規表現はの前にあるすべてのものしか表示しないため、メールを使用して検証することができます\n

正当な理由がほとんどないため、ユーザー名またはメールから新しい行を完全に削除することをお勧めします。次に、安全にEITHER \A \zまたはを使用できます^ $


13
@Ragmaanirは正しいです、それは\z代わりに小文字である必要があり \Zます!
Petr

10
+1ありがとうございます!私はあなたの提案に同意しなければなりませんが:A)適切なキャッチオールがある場合は不要な作業/処理を追加しないでください。B)特に2つを区別することに怠惰なままでいることができる場合はそうではありません。文字列を操作できる位置にいるとは限らず、Regexに限られている場合があるので、正しいものをメモリにコミットして違いを知ってください!
dooleyo 2014年

1
危険なものの例は文字列に含まれている可能性があるため、理解できませんでした。改行の有無にかかわらず、HTMLのサニタイズと検証で修正する必要があるエクスプロイトです。
Jayr Motta、2014

2
@JayrMottaデモンストレーションが示しているのは、危険なものが完全正規表現チェックを完全にバイパスするということです。したがって、正規表現で危険なものをチェックしていたとしても、の$代わりに「文字列の終わり」をチェックしていた場合、それはバイパスされます\z
Doctor Blue

177

つるはしによると:

^ 行頭に一致します。

$ 行の終わりに一致します。

\A 文字列の先頭に一致します。

\z 文字列の末尾に一致します。

\Z 文字列がで終わる場合を除いて、文字列の最後と"\n"一致し"\n"ます。

したがって、\A小文字を使用し\zます。\Z誰かが使用すると、改行文字が入り込む可能性があります。これは危険ではないと私は思いますが、文字列に空白がないと仮定するアルゴリズムを台無しにするかもしれません。正規表現と文字列長の制約に応じて、誰かが改行文字だけで不可視の名前を使用する可能性があります。

JavaScriptのRegexの実装は\A、リテラル'A'ref)として扱います。だから、そこに自分自身を見て、テストしてください。


16

文字列の開始と終了は、必ずしも行の開始と終了と同じであるとは限りません。以下をテスト文字列として使用したと想像してください。

私の
名前

アンドリューです

文字列がその中に多くの行を持っていることに注意してください- ^$文字(基本的に治療しますが、それらの行の先頭と末尾にマッチすることを可能に\nしながら、区切り文字として文字を)\A\Zあなたが全体の文字列の先頭と末尾にマッチすることができます。


1
私の意見では最良の回答です。「基本的に\ n文字をデリミタとして扱う」ことは本当に理解に役立ちました、ありがとう。
Flyout91

11

例による違い

  1. /^foo$/次のいずれかに一致しますが、一致/\Afoo\z/しません。
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/そして、/\Afoo\z/すべてが以下に一致します:
foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.