teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

表現を修正

2021/03/17 03:34

投稿

Daregada
Daregada

スコア11990

answer CHANGED
@@ -4,8 +4,10 @@
4
4
 
5
5
  [RegExp.prototype.exec() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
6
6
 
7
- 偶数回目の`exec`では、**直前の検索でマッチした箇所の直後(今回だと39)に`lastIndex`が設定**されており(検索対象となる文字列がリスト次の要素になっていたとしても)`exec`はそのインデックス以降からマッチを試みる。今回のデータでは検索対象とな文字列の長さが統一されており、このマッチはかならず失敗することにる。
7
+ 1回目の`exec`では、`lastIndex`の値0なので、検索対象となる文字列の先頭からマッチを試み、想定す部分にマッチするき、`lastIndex`の値は「次検索を開始す位置」に設定される(今回だと39)
8
8
 
9
- すると、`lastIndex`の値は0に設定されるので、奇数回目の`exec`では、検索対象となる文字列の先頭からマッチを試み、想定す部分にマッチする。
9
+ 2回目の`exec`では、検索対象となる文字列がリスト次の要素に代わっていたとしても、`exec`は`lastIndex`以降からマッチを試みる。今回のデータでは検索対象とな文字列の長さが統一されており、インデックス39以降は文字がないため、このマッチはかならず失敗することになるすると、`lastIndex`の値は0に設定される。
10
10
 
11
+ というわけで、これ以降も「奇数回目の`exec`では、`lastIndex`が0なので想定される部分にマッチ」し、「偶数回目の`exec`では、`lastIndex`が39なのでマッチに失敗」する、という動作が繰り返される。
12
+
11
- 対処方法としては、`linkRegExp`に`g`フラグを付けない(ステートフル動作をさせない)こと。
13
+ 対処方法としては、言うまでもなく`linkRegExp`に`g`フラグを付けない(前回の状態を引き継ぐステートフル動作をさせない)こと。

1

補足を追加

2021/03/17 03:34

投稿

Daregada
Daregada

スコア11990

answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [RegExp.prototype.exec() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
6
6
 
7
- 偶数回目の`exec`では、**直前の検索でマッチした箇所の直後(今回だと39)に`lastIndex`が設定**されており、`exec`はそのインデックス以降からマッチを試みる。今回のデータでは、検索対象となる文字列の長さが統一されており、このマッチはかならず失敗することになる。
7
+ 偶数回目の`exec`では、**直前の検索でマッチした箇所の直後(今回だと39)に`lastIndex`が設定**されており、(検索対象となる文字列がリストの次の要素になっていたとしても)`exec`はそのインデックス以降からマッチを試みる。今回のデータでは、検索対象となる文字列の長さが統一されており、このマッチはかならず失敗することになる。
8
8
 
9
9
  すると、`lastIndex`の値は0に設定されるので、奇数回目の`exec`では、検索対象となる文字列の先頭からマッチを試み、想定する部分にマッチする。
10
10