質問: document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1"); > > function alertCookieValue() { > alert(cookieValue); > } > > ``` > > ``` (?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$) ``` ↑ test2=以降の「;」を除いた文字列 ``` |^.*$ ``` ↑ またはすべての文字列 になると考えていたので、例えば「test2=World;test1=Hello;」だった場合は「Worldtest1=Hello」を返すのかと思っていたのですが、実行すると「World」が返ってきます。 正規表現を調べたのですが、なぜ「World」だけが返ってくるのかが理解できませんでした。 詳しい方がいらっしゃいましたら、なぜ「World」だけが返ってくるのかを詳しく教えていただきたいです。 宜しくお願い致します。
回答: `[^;]*`の部分の意味を間違えていらっしゃると思います。 `[^;]`は **「`;`」以外のすべての文字** を表し、それに`*`がつくことにより、「`[^;]`がなるべく長く続く文字列」、つまり「**`;`以外の文字がなるべく長く続く文字列**」という意味になります。これは「全ての文字列から`;`を除く」という意味**ではありません**。 この正規表現は、`;`が来た時点で途切れます。`test2=World;test1=Hello;`という文字列だった場合は、`[^;]*`という正規表現がマッチするのは`World`の部分だけです。なぜなら、その次の`;`は`[^;]`に当てはまらないため、`;`が入ってしまうと「`;`以外の文字がなるべく続く文字列」ではなくなってしまい`[^;]*`の意味に反してしまうからです。 ちなみに、replaceの第二引数の文字列中の`$1`は正規表現の括弧で囲まれた部分にマッチした文字列を取り出すという意味です。今回は正規表現中括弧で囲まれているのは`([^;]*)`なので、ここにマッチした文字列、すなわち`World`が取り出されます。