72304


オライリー社のサイ本を参考にJavaScriptの勉強をしているのですが、本で書かれている正規表現の結果が予測と違って混乱しています。

[code]

    const input = "As I was going to Saint Ives";//0~28番目まである29文字（空白もカウント）
    const re = /\w{3,}/ig;
    
    //マッチした単語を配列にして返す。
    console.log(input.match(re)); //['was', 'going', 'Saint', 'Ives']
    
    console.log(input.search(re)); //5（最初に見つかる3文字以上の単語は5番目から始まる）
    console.log(re.test(input)); //true (inputに格納された文字列が3文字以上に該当するか）
    
    let a = re.exec(input); //execは文字位置を記憶する。
    console.log(a)
    
    //実行結果
    [ 'was', 'going', 'Saint', 'Ives' ]
    5
    true
    [
      'going',
      index: 9,
      input: 'As I was going to Saint Ives',
      groups: undefined
    ]
    
[/code]

上記のexecがいまいち分からず、切り出して実行すると先ほどとは出力結果が異なりました。おそらく他のコードに影響されていると思いますが、どのコードもマッチするか確認してるだけで影響を及ぼすように見えません。手を貸して頂けないでしょうか？

[code]

    const input = "As I was going to Saint Ives";
    const re = /\w{3,}/ig;
    
    let a = re.exec(input);
    console.log(a);
    
    
    //実行結果
    [
      'was',
      index: 5,
      input: 'As I was going to Saint Ives',
      groups: undefined
    ]
    
[/code]

引用元  
1)Ethan Brown. Learning JavaScript, 3rd Edition. O'Reilly. イーサン ブラウン ムシャ ヒロユキ
ムシャ ルミ (訳) 2017. 「17章 正規表現」.『初めてのJavascript』. 第3版. オライリージャパン. pp 281.


CC BY-SA 4.0
2020-12-01T01:31:07.677
72303
2020-12-01T02:06:11.230
2020-12-01T02:06:11.230
3060
22565
question
javascript 正規表現
JavaScript正規表現のre.execの出力結果が理解出来ない。


`RegExp` オブジェクトの `lastIndex` プロパティの影響です。  
前者のコードでは `re.test(input)` の実行で `re.lastIndex` が `8` になり、`re.exec(input)`
は8文字目から検索します。

<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test#Using_test_on_a_regex_with_the_global_flag>

> 正規表現にグローバルフラグが設定されている場合、 test() は正規表現が所有する lastIndex の値を加算します。 (exec() も同様に
> lastIndex プロパティの値を加算します。)

<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec>

> JavaScript の RegExp オブジェクトは、 global または sticky フラグが設定されている場合 (例えば /foo/g や
> /foo/y) はステートフルになります。これは前回の一致位置を lastIndex に格納します。これを内部的に使用することで、 exec()
> はテキストの文字列内で (キャプチャグループのある) 複数の一致を反復処理することができます。


CC BY-SA 4.0
2020-12-01T01:52:01.807
72304
2020-12-01T01:52:01.807
3475
72303
answer