正規表現を使った値の取得について

投稿者: Anonymous

javascriptで指定したcookieの値を取り出す場合の参考で正規表現による取り出し方法がありましたが、なぜうまく値がとれているのかがあまり理解できません…

Document.cookie
https://developer.mozilla.org/ja/docs/Web/API/Document/cookie

document.cookie = "test1=Hello";
document.cookie = "test2=World";

var cookieValue = document.cookie.replace(/(?:(?:^|.*;s*)test2s*=s*([^;]*).*$)|^.*$/, "$1");

function alertCookieValue() {
  alert(cookieValue);
}
(?:(?:^|.*;s*)test2s*=s*([^;]*).*$)

↑ test2=以降の「;」を除いた文字列

|^.*$

↑ またはすべての文字列

になると考えていたので、例えば「test2=World;test1=Hello;」だった場合は「Worldtest1=Hello」を返すのかと思っていたのですが、実行すると「World」が返ってきます。

正規表現を調べたのですが、なぜ「World」だけが返ってくるのかが理解できませんでした。

詳しい方がいらっしゃいましたら、なぜ「World」だけが返ってくるのかを詳しく教えていただきたいです。

宜しくお願い致します。

解決

[^;]*の部分の意味を間違えていらっしゃると思います。
[^;];」以外のすべての文字 を表し、それに*がつくことにより、「[^;]がなるべく長く続く文字列」、つまり「;以外の文字がなるべく長く続く文字列」という意味になります。これは「全ての文字列から;を除く」という意味ではありません

この正規表現は、;が来た時点で途切れます。test2=World;test1=Hello;という文字列だった場合は、[^;]*という正規表現がマッチするのはWorldの部分だけです。なぜなら、その次の;[^;]に当てはまらないため、;が入ってしまうと「;以外の文字がなるべく続く文字列」ではなくなってしまい[^;]*の意味に反してしまうからです。


ちなみに、replaceの第二引数の文字列中の$1は正規表現の括弧で囲まれた部分にマッチした文字列を取り出すという意味です。今回は正規表現中括弧で囲まれているのは([^;]*)なので、ここにマッチした文字列、すなわちWorldが取り出されます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *