web-dev-qa-db-ja.com

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

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

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

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

178
collimarco

検証のために正規表現に依存している場合、常に\A\zを使用する必要があります。 ^$は、改行文字までのみ一致します。つまり、正規表現は\nの前にあるものすべてを見るため、[email protected]\n<script>dangerous_stuff();</script>のようなメールを使用し、検証することができます。

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

206
Luke

Pickaxe によると:

^行の先頭に一致します。

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

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

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

\Zは、文字列が"\n"で終わる場合を除き、文字列の末尾に一致します。その場合、"\n"の直前に一致します。

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

JavaScriptのRegexの実装は、\Aをリテラル'A'(- ref )として扱います。だから、そこに気をつけてテストしてください。

166
Ragmaanir

例による違い

  1. /^foo$/は次のいずれかに一致しますが、/\Afoo\z/は一致しません。
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/および/\Afoo\z/はすべて次と一致します。
foo
8
Chun Yang