48558


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

> Document.cookie  
>  <https://developer.mozilla.org/ja/docs/Web/API/Document/cookie>
[code]

>     document.cookie = "test1=Hello";
>     document.cookie = "test2=World";
>  
>     var cookieValue =
> document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/,
> "$1");
>  
>     function alertCookieValue() {
>       alert(cookieValue);
>     }
>  
[/code]

[code]

    (?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)
    
[/code]

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

[code]

    |^.*$
    
[/code]

↑ またはすべての文字列

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

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

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

宜しくお願い致します。


CC BY-SA 4.0
2018-09-19T11:51:16.940
48557
2018-09-19T12:10:36.050
29531
question
javascript 正規表現
正規表現を使った値の取得について


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

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

* * *

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


CC BY-SA 4.0
2018-09-19T12:10:36.050
48558
2018-09-19T12:10:36.050
30079
48557
answer