1. ホーム
  2. javascript

[解決済み] asdf".replace(/.*/g, "x") == "xx "であるのはなぜですか?

2022-04-27 15:31:47

質問

意外な事実に遭遇しました。

console.log("asdf".replace(/.*/g, "x"));

なぜ の置換を行うことができます。 空でない文字列で改行がないものは、このパターンに対してちょうど2つの置換を生成するようです。 置換関数を使って、最初の置換は文字列全体、2番目の置換は空の文字列であることがわかります。

どのように解決するのですか?

の通りです。 ECMA-262 規格に準拠しています。 String.prototype.replace コール RegExp.prototype[@@replace] を指定します。 と言っている。

11. Repeat, while done is false
  a. Let result be ? RegExpExec(rx, S).
  b. If result is null, set done to true.
  c. Else result is not null,
    i. Append result to the end of results.
    ii. If global is false, set done to true.
    iii. Else,
      1. Let matchStr be ? ToString(? Get(result, "0")).
      2. 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).

ここで rx/.*/gS'asdf' .

11.c.iii.2.b を参照のこと。

b. nextIndexをAdvanceStringIndex(S, thisIndex, fullUnicode)とする。

したがって 'asdf'.replace(/.*/g, 'x') というのは、実は

  1. result (未定義), results = [] , lastIndex = 0
  2. 結果 = 'asdf' 結果 [ 'asdf' ] 最終インデックス 4
  3. 結果 = '' 結果 [ 'asdf', '' ] 最終インデックス 4 , AdvanceStringIndex に設定し、lastIndex を 5
  4. 結果 = null 結果 [ 'asdf', '' ] を返します。

したがって、2つのマッチがあります。