JavaScript 4©2ch.net

2014/12/05(金) 12:19:07.19ID:fmzBASgG
( ^ω^) 初学者・迷子・ロリ幼女はこちらで
  _、_
( ,_ノ` ) プロフェッショナルはECMAScript デス 4へ

【前スレ】
JavaScript 3
http://peace.2ch.net/test/read.cgi/tech/1380177260/

【関連スレ】
ECMAScript デス 4
http://peace.2ch.net/test/read.cgi/tech/1325448978/
+ JavaScript の質問用スレッド vol.117 +
http://peace.2ch.net/test/read.cgi/tech/1404146244/
CoffeeScript
http://peace.2ch.net/test/read.cgi/tech/1320949260/
TypeScript part1
http://peace.2ch.net/test/read.cgi/tech/1349187527/
構造化ウェブプログラミング言語Dart2
http://peace.2ch.net/test/read.cgi/tech/1319388343/
Microsoft SkyDrive API
http://peace.2ch.net/test/read.cgi/tech/1385604796/
【MACRO】Google Apps Script 質問スレ【DRIVE】
http://peace.2ch.net/test/read.cgi/tech/1404007623/
【node.js】サーバサイドjavascript 2【Rhino】
http://peace.2ch.net/test/read.cgi/tech/1358937029/
2019/07/13(土) 23:28:56.86ID:57lWPs8z
すいません分かりました。

String.match は RegExp[@@match] を読んでて、その中で RegExp.exec を呼んでいる。
RegExp.exec は当然そのまま RegExp.exec を呼んでいる。
だからそのままだと当然挙動は同じになるのだけど、String.matchの場合、
> 4. If matchStr is the empty String, then
> a. Let thisIndex be ? ToLength(? Get(rx, "lastIndex")).
> b. Let nextIndex be AdvanceStringIndex(S, thisIndex, fullUnicode).
> c. Perform ? Set(rx, "lastIndex", nextIndex, true).
https://tc39.es/ecma262/#sec-regexpbuiltinexec
って書いてあったわ。
つまりマッチ結果が空文字だと必ず一文字進めるようになっており、「文頭マッチのフラグを落とす」仕様にはなってない。
この仕様でいいのか?という気もするが、とにかくそうなっているようだ。
お騒がせしました。
2019/07/16(火) 20:12:13.23ID:hMJFhr7R
というかこれはMDNに注意書きがいる案件だ。
勿論君の手柄にしてくれていいから、誰かやっておいてくれ。
追記は取り敢えず4ヶ所(3文案)か?

1. String.match に、
「空文字にマッチした場合、その空文字の次の文字にはマッチしません。
このため、空文字マッチを含む正規表現(オブジェクト)を与えた場合、全てのマッチ文字列が結果に含まれないことがあります。」

2. String.replaceに、
「空文字にマッチした場合、その空文字の次の文字にはマッチしません。
このため、空文字マッチを含む正規表現(オブジェクト)を与えた場合、全てのマッチ文字列が置換されないことがあります。」

3. RegExp.exexとRegExp.testに、
「空文字にマッチした場合、lastIndexが更新されません。(+1されません)
このため、空文字マッチを含む正規表現(オブジェクト)を与えた場合、
ループ内でマッチ結果の空文字判定を行わないと、無限ループします。」

問題となるケースは、空文字マッチを含む正規表現+空文字マッチ直後にマッチ文字列が来る場合。
具体的には>>341
searchはgマッチ関係ないからセーフ、
splitに関係するケースがあるかは分からない。(ぱっとは思いつかない)
matchAllは知らん。

ちなみに以前 test について文句を言った者だ。これについて対応してくれた人はありがとう。
今回も頼むわ。
なお今確認すると、
> 注目すべきは、別な文字列で検索しても lastIndex がリセットされないことです。
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
とモロに書いてあって素晴らしい。ただこれはもっと赤字とか目立つように書くべきだが。

俺はWeb板は無視しているが、これについてだけは告知貼っておく。
いずれにしてもMDNの更新誰かよろしく。
2019/07/16(火) 20:29:14.99ID:hMJFhr7R
告知は貼った。
https://mevius.5ch.net/test/read.cgi/hp/1562318008/

何かあればここでよろしく。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況