JavaScript 4©2ch.net (398レス)
JavaScript 4©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1417749547/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
341: デフォルトの名無しさん [sage] 2019/07/13(土) 23:28:56.86 ID: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 って書いてあったわ。 つまりマッチ結果が空文字だと必ず一文字進めるようになっており、「文頭マッチのフラグを落とす」仕様にはなってない。 この仕様でいいのか?という気もするが、とにかくそうなっているようだ。 お騒がせしました。 http://mevius.5ch.net/test/read.cgi/tech/1417749547/341
342: デフォルトの名無しさん [sage] 2019/07/16(火) 20:12:13.23 ID: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の更新誰かよろしく。 http://mevius.5ch.net/test/read.cgi/tech/1417749547/342
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.013s