22 テキスト処理

22.1 String オブジェクト

22.1.1 String コンストラクター

String コンストラクター:

  • %String% である。
  • グローバルオブジェクト"String" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しい String オブジェクトを生成し初期化する。
  • コンストラクターではなく関数として呼び出されたとき、型変換を行う。
  • クラス定義の extends 句の値として利用できる。指定された String の挙動を継承したいサブクラスのコンストラクターは、サブクラスインスタンスを [[StringData]] 内部スロット付きで生成・初期化するために String コンストラクターへの super 呼び出しを含めなければならない。

22.1.1.1 String ( value )

この関数は呼び出されたとき以下の手順を実行する:

  1. value が存在しないなら
    1. s を空文字列とする。
  2. それ以外の場合、
    1. NewTarget が undefined で かつ value が Symbol なら、SymbolDescriptiveString(value) を返す。
    2. s を ? ToString(value) とする。
  3. NewTarget が undefined なら s を返す。
  4. StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")) を返す。

22.1.2 String コンストラクターのプロパティ

String コンストラクター:

  • %Function.prototype%[[Prototype]] 内部スロットを持つ。
  • 以下のプロパティを持つ:

22.1.2.1 String.fromCharCode ( ...codeUnits )

この関数は残余引数 codeUnits を構成する任意個の引数で呼び出すことができる。

呼び出されたとき以下を行う:

  1. result を空文字列とする。
  2. codeUnits の各要素 next について
    1. nextCU(? ToUint16(next)) の数値を持つコードユニットとする。
    2. resultresultnextCU文字列連結とする。
  3. result を返す。

この関数の "length" プロパティは 1𝔽 である。

22.1.2.2 String.fromCodePoint ( ...codePoints )

この関数は残余引数 codePoints を構成する任意個の引数で呼び出すことができる。

呼び出されたとき以下を行う:

  1. result を空文字列とする。
  2. codePoints の各要素 next について
    1. nextCP を ? ToNumber(next) とする。
    2. nextCP整数 Number でなければ RangeError 例外を投げる。
    3. (nextCP) < 0 または (nextCP) > 0x10FFFF なら RangeError 例外を投げる。
    4. resultresult と UTF16EncodeCodePoint((nextCP)) の文字列連結とする。
  3. アサート: codePoints が空なら result は空文字列。
  4. result を返す。

この関数の "length" プロパティは 1𝔽 である。

22.1.2.3 String.prototype

String.prototype の初期値は String プロトタイプオブジェクトである。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

22.1.2.4 String.raw ( template, ...substitutions )

この関数は可変個の引数で呼び出される。最初の引数が template、残りがリスト substitutions を構成する。

呼び出されたとき以下を行う:

  1. substitutionCountsubstitutions の要素数とする。
  2. cooked を ? ToObject(template) とする。
  3. literals を ? ToObject(? Get(cooked, "raw" )) とする。
  4. literalCount を ? LengthOfArrayLike(literals) とする。
  5. literalCount ≤ 0 なら空文字列を返す。
  6. R を空文字列とする。
  7. nextIndex を 0 とする。
  8. 繰り返し、
    1. nextLiteralVal を ? Get(literals, ! ToString(𝔽(nextIndex))) とする。
    2. nextLiteral を ? ToString(nextLiteralVal) とする。
    3. RRnextLiteral文字列連結とする。
    4. nextIndex + 1 = literalCount なら R を返す。
    5. nextIndex < substitutionCount なら
      1. nextSubValsubstitutions[nextIndex] とする。
      2. nextSub を ? ToString(nextSubVal) とする。
      3. RRnextSub文字列連結とする。
    6. nextIndexnextIndex + 1 とする。
Note

この関数はタグ付きテンプレート (13.3.11) のタグ関数として使用することを意図している。その場合最初の引数は正しく整形されたテンプレートオブジェクトであり、残りが置換値となる。

22.1.3 String プロトタイプオブジェクトのプロパティ

String プロトタイプオブジェクトは以下を満たす:

  • %String.prototype% である。
  • String エキゾチックオブジェクトであり、そのようなオブジェクトに規定された内部メソッドを持つ。
  • 値が空文字列の [[StringData]] 内部スロットを持つ。
  • 初期値 +0𝔽"length" プロパティを持ち、その属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。

特に明記されない限り、以下で定義される String プロトタイプオブジェクトのメソッドはジェネリックではなく、渡される this 値は String 値か、String 値に初期化された [[StringData]] 内部スロットを持つオブジェクトでなければならない。

22.1.3.1 String.prototype.at ( index )

  1. Othis の値とする。
  2. RequireObjectCoercible(O) を実行する。
  3. S を ? ToString(O) とする。
  4. lenS の長さとする。
  5. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  6. relativeIndex ≥ 0 なら
    1. krelativeIndex とする。
  7. それ以外なら
    1. klen + relativeIndex とする。
  8. k < 0 または klen なら undefined を返す。
  9. Sk から k + 1 までの部分文字列を返す。

22.1.3.2 String.prototype.charAt ( pos )

Note 1

このメソッドは、このオブジェクトを String に変換した値のインデックス pos にあるコードユニットを含む 1 文字の String を返す。その位置に要素がなければ結果は空文字列となる。結果は String オブジェクトではなく String 値である。

pos整数 Number なら x.charAt(pos) の結果は x.substring(pos, pos + 1) の結果と等価である。

呼び出し時に以下を行う:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら空文字列を返す。
  7. Sposition から position + 1 までの部分文字列を返す。
Note 2

このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。そのため他のオブジェクトへ転用できる。

22.1.3.3 String.prototype.charCodeAt ( pos )

Note 1

このメソッドは、このオブジェクトを String に変換した結果内のインデックス pos のコードユニットの数値 (0 以上 216 未満の整数 Number) を返す。その位置に要素がなければ NaN を返す。

呼び出し時に以下を行う:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら NaN を返す。
  7. S のインデックス position のコードユニットの数値を表す Number を返す。
Note 2

このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。

22.1.3.4 String.prototype.codePointAt ( pos )

Note 1

このメソッドは 0x10FFFF𝔽 以下の非負整数 Number を返し、これはこのオブジェクトを String に変換した結果のインデックス pos で始まる UTF-16 エンコードされたコードポイント (6.1.4) の数値である。その位置に要素がなければ undefined を返す。pos で有効なサロゲートペアが開始しなければ、その位置のコードユニットを返す。

呼び出し時の手順:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら undefined を返す。
  7. cp を CodePointAt(S, position) とする。
  8. 𝔽(cp.[[CodePoint]]) を返す。
Note 2

このメソッドはジェネリックであり他オブジェクトに転用可能。

22.1.3.5 String.prototype.concat ( ...args )

Note 1

このメソッドは this の値 (String に変換) のコードユニットに、各引数を String に変換した結果のコードユニットを順に連結した String 値を返す。結果は String オブジェクトではなく String 値。

呼び出し時:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. RS とする。
  5. args の各要素 next について
    1. nextString を ? ToString(next) とする。
    2. RRnextString文字列連結とする。
  6. R を返す。

このメソッドの "length"1𝔽

Note 2

ジェネリックであり他オブジェクトに転用可能。

22.1.3.6 String.prototype.constructor

String.prototype.constructor の初期値は %String% である。

22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )

呼び出し時の手順:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. isRegExp を ? IsRegExp(searchString) とする。
  5. isRegExptrue なら TypeError を投げる。
  6. searchStr を ? ToString(searchString) とする。
  7. lenS の長さとする。
  8. endPositionundefined なら poslen とし、そうでなければ pos を ? ToIntegerOrInfinity(endPosition) とする。
  9. endpos を 0 と len の間にクランプした結果とする。
  10. searchLengthsearchStr の長さとする。
  11. searchLength = 0 なら true を返す。
  12. startend - searchLength とする。
  13. start < 0 なら false を返す。
  14. substringSstart から end部分文字列とする。
  15. substringsearchStr なら true を返す。
  16. false を返す。
Note 1

endPosition - length(this) から始まる対応するコードユニット列が一致すれば true

Note 2

最初の引数が RegExp の場合に例外を投げるのは将来の拡張余地のため。

Note 3

ジェネリックであり転用可能。

22.1.3.8 String.prototype.includes ( searchString [ , position ] )

呼び出し時:

  1. Othis の値。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. isRegExp を ? IsRegExp(searchString)。
  5. isRegExptrue なら TypeError
  6. searchStr を ? ToString(searchString)。
  7. pos を ? ToIntegerOrInfinity(position)。
  8. アサート: positionundefined なら pos は 0。
  9. lenS の長さ。
  10. startpos を 0 と len の間にクランプした結果。
  11. indexStringIndexOf(S, searchStr, start)。
  12. indexnot-found なら false
  13. true を返す。
Note 1

position 以上の位置で searchString部分文字列として現れれば true

Note 2

RegExp の場合例外を投げる理由は将来拡張のため。

Note 3

ジェネリック。

22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )

Note 1

position 以上で最初に現れるインデックスを返し、存在しなければ -1𝔽positionundefined なら +0𝔽

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. searchStr を ? ToString(searchString)。
  5. pos を ? ToIntegerOrInfinity(position)。
  6. アサート: positionundefined なら pos は 0。
  7. lenS の長さ。
  8. startpos を 0 と len の間にクランプした結果。
  9. resultStringIndexOf(S, searchStr, start)。
  10. resultnot-found なら -1𝔽 を返す。
  11. 𝔽(result) を返す。
Note 2

ジェネリック。

22.1.3.10 String.prototype.isWellFormed ( )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. IsStringWellFormedUnicode(S) を返す。

22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )

Note 1

position 以下で最後に現れるインデックスを返し、存在しなければ -1𝔽positionundefined なら文字列長を仮定。

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. searchStr を ? ToString(searchString)。
  5. numPos を ? ToNumber(position)。
  6. アサート: positionundefined なら numPosNaN
  7. numPosNaN なら pos を +∞ とし、そうでなければ pos を ! ToIntegerOrInfinity(numPos)。
  8. lenS の長さ。
  9. searchLensearchStr の長さ。
  10. startpos を 0 と len - searchLen の間にクランプ。
  11. resultStringLastIndexOf(S, searchStr, start)。
  12. resultnot-found なら -1𝔽
  13. 𝔽(result) を返す。
Note 2

ジェネリック。

22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

ECMA-402 国際化 API を含む実装は ECMA-402 の規定に従う。含まない実装では次を用いる:

このメソッドは this 値 (String に変換した S) と that (String に変換した thatValue) のロケール依存比較の結果を NaN 以外の Number で返す。結果はホスト環境の現在のロケールの慣習に従うソート順を表し、SthatValue の前なら負、後なら正、その他は 0(順序なし)となる。

比較の前に以下を行う:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. thatValue を ? ToString(that)。

第2・第3引数の意味は ECMA-402 仕様に定義され、未実装の場合他用途に用いてはならない。

実際の戻り値は追加情報符号化のため実装定義だが、このメソッドは全 String 上の全順序を与える一貫した比較子でなければならず、Unicode 標準の正規等価性を尊重し、正規等価な区別可能文字列の比較で +0𝔽 を返さねばならない。

Note 1

2 引数関数を要求する Array.prototype.sort の引数に直接適切ではない。

Note 2

このメソッドはホスト環境の言語・ロケール機能を利用し得るが、常に Unicode の正規等価性を尊重する必要がある。以下はすべて +0𝔽 を返さねばならない例である:

// Å ANGSTROM SIGN vs.
// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE
"\u212B".localeCompare("A\u030A")

// Ω OHM SIGN vs.
// Ω GREEK CAPITAL LETTER OMEGA
"\u2126".localeCompare("\u03A9")

// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.
// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW
"\u1E69".localeCompare("s\u0307\u0323")

// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE
"\u1E0B\u0323".localeCompare("\u1E0D\u0307")

// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.
// 가 HANGUL SYLLABLE GA
"\u1100\u1161".localeCompare("\uAC00")

正規等価性の定義と議論は Unicode Standard 2章・3章、UAX #15UTN #5、および UTS #10 を参照。

Unicode 互換等価や互換分解は尊重しないことが推奨される。

Note 3

ジェネリックであり転用可能。

22.1.3.13 String.prototype.match ( regexp )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. matcher を ? GetMethod(regexp, %Symbol.match%)。
    2. matcherundefined でなければ
      1. ? Call(matcher, regexp, « O ») を返す。
  4. S を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, undefined)。
  6. ? Invoke(rx, %Symbol.match%, « S ») を返す。
Note

ジェネリック。

22.1.3.14 String.prototype.matchAll ( regexp )

このメソッドは this を表す String に対して regexp で正規表現マッチを行い、マッチ結果を生成するイテレータを返す。各結果は最初の要素にマッチ全体、その後にキャプチャグループを含む配列。マッチしなければ結果を生成しない。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. isRegExp を ? IsRegExp(regexp)。
    2. isRegExptrue なら
      1. flags を ? Get(regexp, "flags")。
      2. RequireObjectCoercible(flags)。
      3. ToString(flags) が "g" を含まなければ TypeError
    3. matcher を ? GetMethod(regexp, %Symbol.matchAll%)。
    4. matcherundefined でなければ
      1. ? Call(matcher, regexp, « O ») を返す。
  4. S を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, "g")。
  6. ? Invoke(rx, %Symbol.matchAll%, « S ») を返す。
Note 1
このメソッドはジェネリックで、this が String オブジェクトである必要はない。
Note 2
String.prototype.split と同様に通常入力を破壊しないよう設計されている。

22.1.3.15 String.prototype.normalize ( [ form ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. formundefined なら f"NFC" とする。
  5. それ以外なら f を ? ToString(form)。
  6. f"NFC", "NFD", "NFKC", "NFKD" のいずれでもなければ RangeError
  7. ns を最新の Unicode Standard の正規化 (Normalization Forms) に従い Sf 指定の正規形に変換した String 値とする。
  8. ns を返す。
Note

ジェネリック。

22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. StringPaddingBuiltinsImpl(O, maxLength, fillString, end) を返す。

22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. StringPaddingBuiltinsImpl(O, maxLength, fillString, start) を返す。

22.1.3.17.1 StringPaddingBuiltinsImpl ( O, maxLength, fillString, placement )

The abstract operation StringPaddingBuiltinsImpl takes arguments O (an ECMAScript language value), maxLength (an ECMAScript language value), fillString (an ECMAScript language value), and placement (start or end) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. S を ? ToString(O)。
  2. intMaxLength(? ToLength(maxLength))。
  3. stringLengthS の長さ。
  4. intMaxLengthstringLength なら S を返す。
  5. fillStringundefined なら fillString をコードユニット 0x0020 (SPACE) のみからなる String とする。
  6. それ以外なら fillString を ? ToString(fillString)。
  7. StringPad(S, intMaxLength, fillString, placement) を返す。

22.1.3.17.2 StringPad ( S, maxLength, fillString, placement )

The abstract operation StringPad takes arguments S (a String), maxLength (a non-negative integer), fillString (a String), and placement (start or end) and returns a String. It performs the following steps when called:

  1. stringLengthS の長さ。
  2. maxLengthstringLength なら S
  3. fillString が空文字列なら S
  4. fillLenmaxLength - stringLength
  5. truncatedStringFillerfillString を繰り返し連結し長さ fillLen に切り詰めた String。
  6. placementstart なら truncatedStringFillerS の連結を返す。
  7. それ以外は StruncatedStringFiller の連結を返す。
Note 1

maxLengthS の長さ未満にならないようクランプされる。

Note 2

fillString の既定は " " (0x0020 SPACE)。

22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )

The abstract operation ToZeroPaddedDecimalString takes arguments n (a non-negative integer) and minLength (a non-negative integer) and returns a String. It performs the following steps when called:

  1. Sn を 10 進数表記した文字列表現。
  2. StringPad(S, minLength, "0", start) を返す。

22.1.3.18 String.prototype.repeat ( count )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. n を ? ToIntegerOrInfinity(count)。
  5. n < 0 または n = +∞ なら RangeError
  6. n = 0 なら空文字列。
  7. Sn 回連結した String を返す。
Note 1

this の値を繰り返したコードユニット列を生成。

Note 2

ジェネリック。

22.1.3.19 String.prototype.replace ( searchValue, replaceValue )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. searchValueundefined でも null でもないなら
    1. replacer を ? GetMethod(searchValue, %Symbol.replace%)。
    2. replacerundefined でなければ
      1. ? Call(replacer, searchValue, « O, replaceValue ») を返す。
  4. string を ? ToString(O)。
  5. searchString を ? ToString(searchValue)。
  6. functionalReplaceIsCallable(replaceValue)。
  7. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue) に設定。
  8. searchLengthsearchString の長さ。
  9. positionStringIndexOf(string, searchString, 0)。
  10. positionnot-found なら string を返す。
  11. precedingstring の 0 から position まで。
  12. followingstringposition + searchLength 以降。
  13. functionalReplacetrue なら
    1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(position), string »))。
  14. それ以外
    1. アサート: replaceValue は String。
    2. captures を空リスト。
    3. replacement を ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue)。
  15. preceding, replacement, following を連結して返す。
Note

ジェネリック。

22.1.3.19.1 GetSubstitution ( matched, str, position, captures, namedCaptures, replacementTemplate )

The abstract operation GetSubstitution takes arguments matched (a String), str (a String), position (a non-negative integer), captures (a List of either Strings or undefined), namedCaptures (an Object or undefined), and replacementTemplate (a String) and returns either a normal completion containing a String or a throw completion. この抽象操作において decimal digit は 0x0030 (DIGIT ZERO) から 0x0039 (DIGIT NINE) までのコードユニット。 It performs the following steps when called:

  1. stringLengthstr の長さ。
  2. アサート: positionstringLength
  3. result を空文字列。
  4. templateRemainderreplacementTemplate
  5. templateRemainder が空文字列でない間繰り返し、
    1. 注記: 以下の手順で接頭辞 ref を分離し、その置換 refReplacement を決定し result に追加する。
    2. templateRemainder"$$" で始まるなら
      1. ref"$$"
      2. refReplacement"$"
    3. それ以外で "$`" で始まるなら
      1. ref"$`"
      2. refReplacementstr の 0 から position まで。
    4. それ以外で "$&" で始まるなら
      1. ref"$&"
      2. refReplacementmatched
    5. それ以外で "$'" (0x0024 + 0x0027) で始まるなら
      1. ref"$'"
      2. matchLengthmatched の長さ。
      3. tailPosposition + matchLength
      4. refReplacementstrmin(tailPos, stringLength) から末尾まで。
      5. 注: tailPosstringLength を超えるのは %RegExp.prototype% でない "exec" を持つオブジェクトにより呼ばれた場合のみ。
    6. それ以外で "$" に 1 個以上の 10 進数字が続くなら
      1. 2 つ以上の数字が続くなら digitCount を 2、そうでなければ 1。
      2. digits を 1 から 1 + digitCount部分文字列
      3. index(StringToNumber(digits))。
      4. アサート: 0 ≤ index ≤ 99。
      5. captureLencaptures の要素数。
      6. index > captureLen かつ digitCount = 2 なら
        1. 注: 2 桁が範囲外なら 1 桁とリテラル数字に扱い直す。
        2. digitCount を 1。
        3. digits をその先頭 1 桁に。
        4. index(StringToNumber(digits))。
      7. ref を 0 から 1 + digitCount部分文字列
      8. 1 ≤ indexcaptureLen なら
        1. capturecaptures[index - 1]。
        2. captureundefined なら
          1. refReplacement を空文字列。
        3. それ以外
          1. refReplacementcapture
      9. それ以外
        1. refReplacementref
    7. それ以外で "$<" で始まるなら
      1. gtPosStringIndexOf(templateRemainder, ">", 0)。
      2. gtPosnot-found または namedCapturesundefined なら
        1. ref"$<"
        2. refReplacementref
      3. それ以外
        1. ref を 0 から gtPos + 1 の部分。
        2. groupName を 2 から gtPos の部分。
        3. アサート: namedCaptures はオブジェクト。
        4. capture を ? Get(namedCaptures, groupName)。
        5. captureundefined なら
          1. refReplacement を空文字列。
        6. それ以外
          1. refReplacement を ? ToString(capture)。
    8. それ以外
      1. ref を 0 から 1 の部分。
      2. refReplacementref
    9. refLengthref の長さ。
    10. templateRemainderrefLength 以降の部分へ。
    11. resultresultrefReplacement の連結。
  6. result を返す。

22.1.3.20 String.prototype.replaceAll ( searchValue, replaceValue )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. searchValueundefined でも null でもないなら
    1. isRegExp を ? IsRegExp(searchValue)。
    2. isRegExptrue なら
      1. flags を ? Get(searchValue, "flags")。
      2. RequireObjectCoercible(flags)。
      3. ToString(flags) に "g" が含まれなければ TypeError
    3. replacer を ? GetMethod(searchValue, %Symbol.replace%)。
    4. replacerundefined でなければ
      1. ? Call(replacer, searchValue, « O, replaceValue ») を返す。
  4. string を ? ToString(O)。
  5. searchString を ? ToString(searchValue)。
  6. functionalReplaceIsCallable(replaceValue)。
  7. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue)。
  8. searchLengthsearchString の長さ。
  9. advanceBymax(1, searchLength)。
  10. matchPositions を空リスト。
  11. positionStringIndexOf(string, searchString, 0)。
  12. positionnot-found でない間繰り返し、
    1. matchPositionsposition を追加。
    2. positionStringIndexOf(string, searchString, position + advanceBy) に設定。
  13. endOfLastMatch を 0。
  14. result を空文字列。
  15. matchPositions の各 p について
    1. preservedstringendOfLastMatch から p まで。
    2. functionalReplacetrue なら
      1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(p), string »))。
    3. それ以外
      1. アサート: replaceValue は String。
      2. captures を空リスト。
      3. replacement を ! GetSubstitution(searchString, string, p, captures, undefined, replaceValue)。
    4. resultresult, preserved, replacement の連結に。
    5. endOfLastMatchp + searchLength に。
  16. endOfLastMatch < string の長さ なら
    1. resultresultstringendOfLastMatch 以降の部分の連結に。
  17. result を返す。

22.1.3.21 String.prototype.search ( regexp )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. searcher を ? GetMethod(regexp, %Symbol.search%)。
    2. searcherundefined でなければ
      1. ? Call(searcher, regexp, « O ») を返す。
  4. string を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, undefined)。
  6. ? Invoke(rx, %Symbol.search%, « string ») を返す。
Note

ジェネリック。

22.1.3.22 String.prototype.slice ( start, end )

このメソッドは、このオブジェクトを String に変換した結果の start から (含まない)end まで(endundefined なら末尾まで)の substring を返す。start が負なら sourceLength + start とみなし、end が負なら sourceLength + end とみなす。結果は String 値。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. lenS の長さ。
  5. intStart を ? ToIntegerOrInfinity(start)。
  6. intStart = -∞ なら from を 0。
  7. それ以外で intStart < 0 なら frommax(len + intStart, 0)。
  8. それ以外は frommin(intStart, len)。
  9. endundefined なら intEndlen、そうでなければ ? ToIntegerOrInfinity(end)。
  10. intEnd = -∞ なら to を 0。
  11. それ以外で intEnd < 0 なら tomax(len + intEnd, 0)。
  12. それ以外は tomin(intEnd, len)。
  13. fromto なら空文字列。
  14. Sfrom から to部分文字列を返す。
Note

ジェネリック。

22.1.3.23 String.prototype.split ( separator, limit )

このメソッドは、このオブジェクトを String に変換した結果を左から separator の出現で分割した部分文字列を配列に格納し返す。separator は任意長の String または %Symbol.split% メソッドを持つオブジェクト (例: RegExp)。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. separatorundefined でも null でもないなら
    1. splitter を ? GetMethod(separator, %Symbol.split%)。
    2. splitterundefined でなければ
      1. ? Call(splitter, separator, « O, limit ») を返す。
  4. S を ? ToString(O)。
  5. limitundefined なら lim を 232 - 1、そうでなければ (? ToUint32(limit))。
  6. R を ? ToString(separator)。
  7. lim = 0 なら CreateArrayFromList(« »)。
  8. separatorundefined なら CreateArrayFromListS »)。
  9. separatorLengthR の長さ。
  10. separatorLength = 0 なら
    1. strLenS の長さ。
    2. outLenlim を 0 と strLen の間にクランプした結果。
    3. headS の 0 から outLen
    4. codeUnitshead のコードユニット列リスト。
    5. CreateArrayFromList(codeUnits) を返す。
  11. S が空文字列なら CreateArrayFromListS »)。
  12. substrings を空リスト。
  13. i を 0。
  14. jStringIndexOf(S, R, 0)。
  15. jnot-found でない間
    1. TSi から j
    2. substringsT を追加。
    3. substrings の要素数が lim なら CreateArrayFromList(substrings)。
    4. ij + separatorLength
    5. jStringIndexOf(S, R, i)。
  16. TSi から末尾。
  17. substringsT を追加。
  18. CreateArrayFromList(substrings) を返す。
Note 1

separator が空文字列なら先頭末尾や直前マッチ末尾の空部分文字列はマッチしない。結果配列長は文字列長で各要素は1コードユニット。

this が空文字列の場合、separator が空文字列にマッチするなら結果は空、そうでなければ 1 要素(空文字列)。

separatorundefined なら結果は 1 要素で this の文字列表現。limit が指定されればサイズ制限。

Note 2

ジェネリック。

22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. isRegExp を ? IsRegExp(searchString)。
  5. isRegExptrue なら TypeError
  6. searchStr を ? ToString(searchString)。
  7. lenS の長さ。
  8. positionundefined なら pos を 0、そうでなければ ? ToIntegerOrInfinity(position)。
  9. startpos を 0 と len の間にクランプした結果。
  10. searchLengthsearchStr の長さ。
  11. searchLength = 0 なら true
  12. endstart + searchLength
  13. end > len なら false
  14. substringSstart から end
  15. substring = searchStr なら true
  16. false を返す。
Note 1

指定位置からの一致で true

Note 2

RegExp の場合例外を投げる理由は将来拡張のため。

Note 3

ジェネリック。

22.1.3.25 String.prototype.substring ( start, end )

このメソッドは、このオブジェクトを String に変換した結果のインデックス start から (含まない)end まで(endundefined なら末尾まで)の substring を返す。結果は String 値。

どちらかの引数が NaN または負なら 0 に置換。長さを超えるなら長さに置換。

start > end の場合は入れ替える。

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. lenS の長さ。
  5. intStart を ? ToIntegerOrInfinity(start)。
  6. endundefined なら intEndlen、そうでなければ ? ToIntegerOrInfinity(end)。
  7. finalStartintStart を 0 と len の間にクランプした結果。
  8. finalEndintEnd を 0 と len の間にクランプした結果。
  9. frommin(finalStart, finalEnd)。
  10. tomax(finalStart, finalEnd)。
  11. Sfrom から to部分文字列を返す。
Note

ジェネリック。

22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 実装時はそちらに従う。未実装時は以下。

このメソッドは 6.1.4 に記載の UTF-16 コードポイント列として String を解釈する。

toLowerCase と同様だがロケール依存(例: トルコ語など特別な場合)。

オプション引数の意味は ECMA-402 に定義され、未実装時は他用途禁止。

Note

ジェネリック。

22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 実装時はその仕様に従う。未実装時は以下。

String を UTF-16 コードポイント列として解釈。

toUpperCase と同様だがロケール依存結果を意図。

オプション引数の意味は ECMA-402 にのみ定義。

Note

ジェネリック。

22.1.3.28 String.prototype.toLowerCase ( )

String を UTF-16 コードポイント列として解釈する (6.1.4)。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. sText を StringToCodePoints(S)。
  5. lowerText を Unicode 既定のケース変換アルゴリズムに従い toLowercase(sText)。
  6. L を CodePointsToString(lowerText)。
  7. L を返す。

結果は Unicode Character Database のロケール非依存マッピング(UnicodeData.txtSpecialCasing.txt のロケール非依存部分)に従う。

Note 1

一部コードポイントは複数コードポイントへ写像され長さが変わり得る。toUpperCasetoLowerCase は文脈依存で対称ではない。

Note 2

ジェネリック。

22.1.3.29 String.prototype.toString ( )

呼び出し時:

  1. ThisStringValue(this value) を返す。
Note

String オブジェクトにおいては valueOf と同じ結果。

22.1.3.30 String.prototype.toUpperCase ( )

String を UTF-16 コードポイント列として解釈する。

String.prototype.toLowerCase と同様に動作するが Unicode 既定ケース変換の大文字化アルゴリズムを用いる。

Note

ジェネリック。

22.1.3.31 String.prototype.toWellFormed ( )

このオブジェクトの文字列表現から、サロゲートペアを構成しない孤立した先行・後続サロゲートを U+FFFD (REPLACEMENT CHARACTER) に置換した String を返す。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. strLenS の長さ。
  5. k を 0。
  6. result を空文字列。
  7. k < strLen の間繰り返し
    1. cp を CodePointAt(S, k)。
    2. cp.[[IsUnpairedSurrogate]]true なら
      1. resultresult と 0xFFFD の連結。
    3. それ以外
      1. resultresult と UTF16EncodeCodePoint(cp.[[CodePoint]]) の連結。
    4. kk + cp.[[CodeUnitCount]]
  8. result を返す。

22.1.3.32 String.prototype.trim ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, start+end) を返す。
Note

ジェネリック。

22.1.3.32.1 TrimString ( string, where )

The abstract operation TrimString takes arguments string (an ECMAScript language value) and where (start, end, or start+end) and returns either a normal completion containing a String or a throw completion. string を UTF-16 コードポイント列として解釈する。 It performs the following steps when called:

  1. RequireObjectCoercible(string)。
  2. S を ? ToString(string)。
  3. wherestart なら
    1. TS から前方空白を除去した String。
  4. それ以外で whereend なら
    1. TS から後方空白を除去した String。
  5. それ以外
    1. アサート: wherestart+end
    2. TS の前後空白を除去した String。
  6. T を返す。

空白の定義は WhiteSpaceLineTerminator の和集合。Unicode 一般カテゴリ Space_Separator (“Zs”) の判定は UTF-16 として解釈する。

22.1.3.33 String.prototype.trimEnd ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, end) を返す。
Note

ジェネリック。

22.1.3.34 String.prototype.trimStart ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, start) を返す。
Note

ジェネリック。

22.1.3.35 String.prototype.valueOf ( )

呼び出し時:

  1. ThisStringValue(this value) を返す。

22.1.3.35.1 ThisStringValue ( value )

The abstract operation ThisStringValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. value が String なら value を返す。
  2. value がオブジェクトで [[StringData]] 内部スロットを持つなら
    1. svalue.[[StringData]]
    2. アサート: s は String。
    3. s を返す。
  3. TypeError 例外を投げる。

22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )

このメソッドは String 値のコードポイントを順次 (各コードポイントを String として) 返すイテレータオブジェクトを返す。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. s を ? ToString(O)。
  4. closures を捕捉し、呼び出し時に以下を行う抽象クロージャとする:
    1. lens の長さ。
    2. position を 0。
    3. position < len の間繰り返し
      1. cp を CodePointAt(s, position)。
      2. nextIndexposition + cp.[[CodeUnitCount]]
      3. resultStringsposition から nextIndex
      4. positionnextIndex
      5. GeneratorYield(CreateIteratorResultObject(resultString, false))。
    4. NormalCompletion(unused) を返す。
  5. CreateIteratorFromClosure(closure, "%StringIteratorPrototype%", %StringIteratorPrototype%) を返す。

このメソッドの "name" プロパティの値は "[Symbol.iterator]" である。

22.1.4 String インスタンスのプロパティ

String インスタンスは String エキゾチックオブジェクトであり、その内部メソッドを持つ。String インスタンスは String プロトタイプオブジェクトからプロパティを継承し、[[StringData]] 内部スロットを持つ。この内部スロットはその String オブジェクトが表す String 値である。

String インスタンスは "length" プロパティと整数インデックス名を持つ列挙可能プロパティ集合を持つ。

22.1.4.1 length

この String オブジェクトが表す String 値の要素数。

一度初期化されると不変。このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

22.1.5 String 反復子オブジェクト

String Iterator は特定の String インスタンス上の特定の反復を表すオブジェクト。名前付きコンストラクターは存在せず、String インスタンスの特定メソッド呼び出しで生成される。

22.1.5.1 %StringIteratorPrototype% オブジェクト

%StringIteratorPrototype% オブジェクト:

  • 全ての String Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。
  • 次のプロパティを持つ:

22.1.5.1.1 %StringIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%StringIteratorPrototype%") を返す。

22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "String Iterator" である。

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

22.2 RegExp (正規表現) オブジェクト

RegExp オブジェクトは正規表現パターンと関連するフラグを保持する。

Note

正規表現の形式と機能は Perl 5 の正規表現機能を手本としている。

22.2.1 パターン

RegExp コンストラクターは入力のパターン文字列に対して以下の文法を適用する。文字列が Pattern の展開として解釈できない場合、エラーが発生する。

構文

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

関連付ける \u HexLeadSurrogate の選択が曖昧である各 \u HexTrailSurrogate は、他に対応する \u HexTrailSurrogate を持たない最も近い u HexLeadSurrogate に関連付けられなければならない。

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] Note 1

最初の二つの行は CharacterClass と同等である。

ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~ Note 2

この節の複数の生成規則は B.1.2 で別定義が与えられる。

22.2.1.1 静的セマンティクス: 早期エラー

Note

この節は B.1.2.1 で修正される。

Pattern :: Disjunction
  • CountLeftCapturingParensWithin(Pattern) ≥ 232 - 1 の場合、構文エラー。
  • Pattern が互いに異なる二つの GroupSpecifier xy を含み、それらの CapturingGroupName が等しく、かつ MightBothParticipate(x, y) が true の場合、構文エラー。
QuantifierPrefix :: { DecimalDigits , DecimalDigits } Atom :: (? RegularExpressionModifiers : Disjunction ) Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction ) AtomEscape :: k GroupName
  • GroupSpecifiersThatMatch(GroupName) が空なら構文エラー。
AtomEscape :: DecimalEscape
  • DecimalEscape の CapturingGroupNumber が AtomEscape を含む Pattern 内の CountLeftCapturingParensWithin より大きい場合、構文エラー。
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  • 最初または二番目の ClassAtom の IsCharacterClass が true なら構文エラー。
  • 両方の IsCharacterClass が false で、かつ最初の CharacterValue > 二番目の CharacterValue の場合構文エラー。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  • LoneUnicodePropertyNameOrValue が General_Category (gc) の値あるいは値エイリアス(PropertyValueAliases.txt)にも、「Property name and aliases」欄(Table 68)に列挙されるバイナリプロパティ/エイリアスにも、文字列のバイナリプロパティ(Table 69 の「Property name」列)にも該当しない場合構文エラー。
  • 外側の Pattern[UnicodeSetsMode] パラメータがなく、かつ LoneUnicodePropertyNameOrValue が文字列のバイナリプロパティ(同表)である場合構文エラー。
CharacterClassEscape :: P{ UnicodePropertyValueExpression } CharacterClass :: [^ ClassContents ]
  • ClassContents の MayContainStrings が true なら構文エラー。
NestedClass :: [^ ClassContents ]
  • ClassContents の MayContainStrings が true なら構文エラー。
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  • 最初の ClassSetCharacter の CharacterValue が 2 番目より大きい場合構文エラー。

22.2.1.2 静的セマンティクス: CountLeftCapturingParensWithin ( node: a Parse Node, ): 非負整数

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. node 内の左捕捉括弧の個数を返す。左捕捉括弧とは Atom :: ( GroupSpecifieropt Disjunction ) 生成規則の ( 終端にマッチする任意の ( パターン文字である。

Note

この節は B.1.2.2 で修正される。

It performs the following steps when called:

  1. アサート: nodeRegExp パターン文法 の生成規則インスタンスである。
  2. node に含まれる Atom :: ( GroupSpecifieropt Disjunction ) の構文木ノード数を返す。

22.2.1.3 静的セマンティクス: CountLeftCapturingParensBefore ( node: a Parse Node, ): 非負整数

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 外側のパターン内で node の左側に現れる左捕捉括弧の数を返す。

Note

この節は B.1.2.2 で修正される。

It performs the following steps when called:

  1. アサート: nodeRegExp パターン文法 の生成規則インスタンスである。
  2. patternnode を含む Pattern とする。
  3. pattern 内で node より前に出現するか、node を包含する Atom :: ( GroupSpecifieropt Disjunction ) ノードの数を返す。

22.2.1.4 静的セマンティクス: MightBothParticipate ( x: a Parse Node, y: a Parse Node, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. アサート: xy は同じ外側の Pattern を持つ。
  2. 外側の Pattern Disjunction :: Alternative | Disjunction ノードを含み、xAlternative 内に、y が派生した Disjunction 内(または逆)に含まれる場合 false を返す。
  3. true を返す。

22.2.1.5 静的セマンティクス: CapturingGroupNumber : 正の整数

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.1 で修正される。

It is defined piecewise over the following productions:

DecimalEscape :: NonZeroDigit
  1. NonZeroDigit の MV を返す。
DecimalEscape :: NonZeroDigit DecimalDigits
  1. nDecimalDigits のコードポイント数とする。
  2. (NonZeroDigit の MV × 10n + DecimalDigits の MV) を返す。

NonZeroDigit の MV” と “DecimalDigits の MV” の定義は 12.9.3 にある。

22.2.1.6 静的セマンティクス: IsCharacterClass : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.3 で修正される。

It is defined piecewise over the following productions:

ClassAtom :: - ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - ClassEscape :: b - CharacterEscape
  1. false を返す。
ClassEscape :: CharacterClassEscape
  1. true を返す。

22.2.1.7 静的セマンティクス: CharacterValue : 非負整数

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.4 で修正される。

It is defined piecewise over the following productions:

ClassAtom :: -
  1. U+002D (HYPHEN-MINUS) の数値を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. chSourceCharacter にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassEscape :: b
  1. U+0008 (BACKSPACE) の数値を返す。
ClassEscape :: -
  1. U+002D (HYPHEN-MINUS) の数値を返す。
CharacterEscape :: ControlEscape
  1. Table 65 に従う数値を返す。
Table 65: ControlEscape コードポイント値
ControlEscape 数値 Code Point Unicode 名 記号
t 9 U+0009 CHARACTER TABULATION <HT>
n 10 U+000A LINE FEED (LF) <LF>
v 11 U+000B LINE TABULATION <VT>
f 12 U+000C FORM FEED (FF) <FF>
r 13 U+000D CARRIAGE RETURN (CR) <CR>
CharacterEscape :: c AsciiLetter
  1. chAsciiLetter にマッチしたコードポイントとする。
  2. ich の数値とする。
  3. i を 32 で割った余りを返す。
CharacterEscape :: 0 [lookahead ∉ DecimalDigit]
  1. U+0000 (NULL) の数値を返す。
Note 2

\0 は <NUL> 文字を表し、その後に 10 進数字を続けることはできない。

CharacterEscape :: HexEscapeSequence
  1. HexEscapeSequence の MV を返す。
RegExpUnicodeEscapeSequence :: u HexLeadSurrogate \u HexTrailSurrogate
  1. leadHexLeadSurrogate の CharacterValue とする。
  2. trailHexTrailSurrogate の CharacterValue とする。
  3. cp を UTF16SurrogatePairToCodePoint(lead, trail) とする。
  4. cp の数値を返す。
RegExpUnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits の MV を返す。
RegExpUnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint の MV を返す。
HexLeadSurrogate :: Hex4Digits HexTrailSurrogate :: Hex4Digits HexNonSurrogate :: Hex4Digits
  1. Hex4Digits の MV を返す。
CharacterEscape :: IdentityEscape
  1. chIdentityEscape にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
  1. chSourceCharacter にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \ ClassSetReservedPunctuator
  1. chClassSetReservedPunctuator にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \b
  1. U+0008 (BACKSPACE) の数値を返す。

22.2.1.8 静的セマンティクス: MayContainStrings : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

CharacterClassEscape :: d D s S w W P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue NestedClass :: [^ ClassContents ] ClassContents :: [empty] NonemptyClassRanges ClassSetOperand :: ClassSetCharacter
  1. false を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. LoneUnicodePropertyNameOrValueTable 69 の「Property name」欄にある文字列のバイナリプロパティであれば true を返す。
  2. false を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. ClassUnion が存在するならその MayContainStrings を返す。
  2. false を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. ClassSetOperand の MayContainStrings が true なら true を返す。
  2. ClassUnion が存在するならその MayContainStrings を返す。
  3. false を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. 最初の ClassSetOperand の MayContainStrings が false なら false
  2. 二番目の ClassSetOperand の MayContainStrings が false なら false
  3. true を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. ClassIntersection の MayContainStrings が false なら false
  2. ClassSetOperand の MayContainStrings が false なら false
  3. true を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 最初の ClassSetOperand の MayContainStrings を返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. ClassSubtraction の MayContainStrings を返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. ClassString の MayContainStrings が true なら true
  2. ClassStringDisjunctionContents の MayContainStrings を返す。
ClassString :: [empty]
  1. true を返す。
ClassString :: NonEmptyClassString
  1. NonEmptyClassString の MayContainStrings を返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. NonEmptyClassString が存在するなら true
  2. false を返す。

22.2.1.9 静的セマンティクス: GroupSpecifiersThatMatch ( thisGroupName: a GroupName Parse Node, ): GroupSpecifier 構文ノードのリスト

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. namethisGroupName の CapturingGroupName とする。
  2. patternthisGroupName を含む Pattern とする。
  3. result を新しい空リストとする。
  4. pattern が含む各 GroupSpecifier gs について
    1. gs の CapturingGroupName が name なら
      1. gsresult に追加。
  5. result を返す。

22.2.1.10 静的セマンティクス: CapturingGroupName : String

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

GroupName :: < RegExpIdentifierName >
  1. idTextUnescapedRegExpIdentifierName の RegExpIdentifierCodePoints とする。
  2. CodePointsToString(idTextUnescaped) を返す。

22.2.1.11 静的セマンティクス: RegExpIdentifierCodePoints : コードポイントのリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegExpIdentifierName :: RegExpIdentifierStart
  1. cpRegExpIdentifierStart の RegExpIdentifierCodePoint とする。
  2. « cp » を返す。
RegExpIdentifierName :: RegExpIdentifierName RegExpIdentifierPart
  1. cps を派生した RegExpIdentifierName の RegExpIdentifierCodePoints とする。
  2. cpRegExpIdentifierPart の RegExpIdentifierCodePoint とする。
  3. cps に « cp » を連結したリストを返す。

22.2.1.12 静的セマンティクス: RegExpIdentifierCodePoint : コードポイント

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegExpIdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar にマッチしたコードポイントを返す。
RegExpIdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar にマッチしたコードポイントを返す。
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
  1. RegExpUnicodeEscapeSequence の CharacterValue を数値とするコードポイントを返す。
RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate
  1. leadUnicodeLeadSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。
  2. trailUnicodeTrailSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。
  3. UTF16SurrogatePairToCodePoint(lead, trail) を返す。

22.2.2 パターンのセマンティクス

正規表現パターンは以下で記述される手順を用いて抽象クロージャ (Abstract Closure) に変換される。実装は、結果が同一である限り、以下に挙げるものより効率的なアルゴリズムを用いることが推奨される。この抽象クロージャは RegExp オブジェクトの [[RegExpMatcher]] 内部スロットの値として使われる。

Pattern は、その関連フラグに uv も含まない場合 BMP パターンである。そうでなければ Unicode パターンである。BMP パターンは、基本多言語面 (BMP) の範囲内の Unicode コードポイントから成る 16 ビット値列として解釈される String に対してマッチを行う。Unicode パターンは UTF-16 でエンコードされた Unicode コードポイント列として解釈される String に対してマッチを行う。BMP パターンの挙動を記述する文脈では「文字」は単一の 16 ビット Unicode BMP コードポイントを意味する。Unicode パターンの挙動を記述する文脈では「文字」は UTF-16 でエンコードされたコードポイント (6.1.4) を意味する。いずれの文脈でも「character value」は対応する非エンコードなコードポイントの数値を意味する。

Pattern の構文とセマンティクスは、そのソーステキストが SourceCharacter 値の List であり、各 SourceCharacter が Unicode コードポイントに対応するとして定義される。BMP パターンが非 BMP の SourceCharacter を含む場合、パターン全体は UTF-16 でエンコードされ、そのエンコーディングの個々のコードユニットが List の要素として用いられる。

Note

例えば、ソーステキスト中で単一の非 BMP 文字 U+1D11E (MUSICAL SYMBOL G CLEF) で表されたパターンを考える。Unicode パターンとして解釈されると、それは単一コードポイント U+1D11E を要素とする 1 要素 (1 文字) の List となる。しかし BMP パターンとして解釈される場合、まず UTF-16 にエンコードされ、コードユニット 0xD834 と 0xDD1E から成る 2 要素の List となる。

パターンは非 BMP 文字が UTF-16 エンコードされた ECMAScript の String 値として RegExp コンストラクターに渡される。例えば単一文字 MUSICAL SYMBOL G CLEF のパターンは、長さ 2 の String であり、その要素はコードユニット 0xD834 と 0xDD1E であった。したがって、2 つのパターン文字から成る BMP パターンとして処理するためにこれ以上の変換は不要である。しかし Unicode パターンとして処理するには UTF16SurrogatePairToCodePoint を用いて、その唯一の要素が単一パターン文字 (コードポイント U+1D11E) である List を生成しなければならない。

実装は実際に UTF-16 との間のこのような変換を行わないかもしれないが、本仕様のセマンティクスは、パターンマッチングの結果があたかもそのような変換が行われたかのようであることを要求する。

22.2.2.1 表記

以下の記述では次の内部データ構造を用いる:

  • CharSetElement は次の 2 種類のいずれかである:
    • rer.[[UnicodeSets]]false の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字。
    • rer.[[UnicodeSets]]true の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字列(要素がそのような文字である列)。これには空列、1 文字列、複数文字列が含まれる。利便性のため、この種の CharSetElement を扱う際、単一文字は 1 文字列と同一視して扱う。
  • CharSet は CharSetElement の数学的集合。
  • CaptureRange は { [[StartIndex]], [[EndIndex]] } という Record で、キャプチャに含まれる文字の範囲を表す。[[StartIndex]]Input 内での開始インデックス (含む) を表す整数[[EndIndex]]Input 内での終了インデックス (含まない) を表す整数である。任意の CaptureRange について、これらのインデックスは [[StartIndex]][[EndIndex]] という不変条件を満たさなければならない。
  • MatchState は { [[Input]], [[EndIndex]], [[Captures]] } という Record で、[[Input]] はマッチ対象の String を表す文字の List[[EndIndex]]整数[[Captures]] はパターン中の各左捕捉括弧に対応する値の List である。MatchState は正規表現マッチングアルゴリズム中の部分的なマッチ状態を表す。[[EndIndex]] はこれまでにパターンがマッチした最後の入力文字のインデックス + 1 を表し、[[Captures]] は捕捉括弧の結果を保持する。[[Captures]]nth 要素は n 番目の捕捉括弧が捕捉した文字範囲を表す CaptureRange か、まだ到達していない場合 undefined である。バックトラッキングのため、マッチング過程の任意時点で多数の MatchState が使用され得る。
  • MatcherContinuation は 1 つの MatchState 引数を取り、MatchState または failure を返す抽象クロージャ。MatcherContinuation はパターンの残り部分(クロージャが捕捉した値で特定される)を、引数の MatchState が示す中間状態から Input に対してマッチさせようとする。成功すれば最終的な MatchState を返し、失敗すれば failure を返す。
  • Matcher は 2 つの引数(MatchStateMatcherContinuation)を取り、MatchState または failure を返す抽象クロージャ。Matcher はパターンの中間サブパターン(クロージャが捕捉した値で特定される)をその MatchState[[Input]] に対し、引数の MatchState が示す中間状態からマッチさせる。MatcherContinuation 引数は残りのパターンをマッチさせるクロージャであるべき。サブパターンをマッチさせて新しい MatchState を得た後、Matcher はその新しい MatchState に対して MatcherContinuation を呼び、残りのパターンがマッチできるか確認する。できれば MatcherMatcherContinuation が返した MatchState を返し、できなければ選択点での別の選択を試み、成功するか全可能性が尽きるまで MatcherContinuation を繰り返し呼ぶ。

22.2.2.1.1 RegExp レコード

RegExp Record は、コンパイル中および必要に応じてマッチング中に RegExp について必要となる情報を保持するために用いられる Record 値である。

次のフィールドを持つ:

Table 66: RegExp Record Fields
Field Name Value Meaning
[[IgnoreCase]] Boolean フラグに "i" が現れるか
[[Multiline]] Boolean フラグに "m" が現れるか
[[DotAll]] Boolean フラグに "s" が現れるか
[[Unicode]] Boolean フラグに "u" が現れるか
[[UnicodeSets]] Boolean フラグに "v" が現れるか
[[CapturingGroupsCount]] 非負整数 パターン内の左捕捉括弧の数

22.2.2.2 実行時セマンティクス: CompilePattern : 文字の List と非負整数を取り MatchState か failure を返す抽象クロージャ

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Pattern :: Disjunction
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. rerm を捕捉し、(Input, index) を引数に取り呼び出し時に以下を行う新しい抽象クロージャを返す:
    1. アサート: Input は文字の List
    2. アサート: 0 ≤ indexInput の要素数。
    3. c を (y) を引数に取り以下を行う新しい MatcherContinuation(何も捕捉しない)とする:
      1. アサート: yMatchState
      2. y を返す。
    4. caprer.[[CapturingGroupsCount]] 個の undefined を 1 から rer.[[CapturingGroupsCount]] で索引付けした List とする。
    5. xMatchState { [[Input]]: Input, [[EndIndex]]: index, [[Captures]]: cap } とする。
    6. m(x, c) を返す。
Note

Pattern は抽象クロージャ値へコンパイルされる。RegExpBuiltinExec はその後、この手続を文字 List とその List 内のオフセットへ適用し、そのパターンがそのオフセットで正確にマッチするか、マッチするなら捕捉括弧の値が何であるかを決定できる。22.2.2 のアルゴリズムは、パターンのコンパイル時に SyntaxError 例外を投げ得るよう設計されている。一方で、一度成功裏にコンパイルされた後、得られる抽象クロージャを用いて文字 List 内でマッチを探索する際には(メモリ不足など実装定義の例外を除き)例外は投げられない。

22.2.2.3 実行時セマンティクス: CompileSubpattern : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.5 で修正される。

It is defined piecewise over the following productions:

Disjunction :: Alternative | Disjunction
  1. m1Alternative の CompileSubpattern (引数 rer, direction) とする。
  2. m2Disjunction の CompileSubpattern (引数 rer, direction) とする。
  3. MatchTwoAlternatives(m1, m2) を返す。
Note 2

| 演算子は 2 つの選択肢を分離する。まず左側の Alternative(および正規表現の後続)へのマッチを試み、失敗したら右側の Disjunction(および後続)を試みる。左 Alternative、右 Disjunction、後続がいずれも選択点を持つ場合、左 Alternative の次の選択へ進む前に後続内の全ての選択が試される。左 Alternative の選択が尽きたら、左 Alternative の代わりに右 Disjunction が試される。| によりスキップされたパターン部分内の捕捉括弧は undefined を生成する。例:

/a|ab/.exec("abc")

は結果 "a" を返し "ab" ではない。また

/((a)|(ab))((c)|(bc))/.exec("abc")

は配列

["abc", "a", "a", undefined, "bc", undefined, "bc"]

を返し、

["abc", "ab", undefined, "ab", "c", "c", undefined]

ではない。2 つの選択肢を試す順序は direction の値と無関係。

Alternative :: [empty]
  1. EmptyMatcher() を返す。
Alternative :: Alternative Term
  1. m1Alternative の CompileSubpattern (引数 rer, direction) とする。
  2. m2Term の CompileSubpattern (引数 rer, direction) とする。
  3. MatchSequence(m1, m2, direction) を返す。
Note 3

連続する TermInput の連続部分に同時にマッチを試みる。directionforward のとき、左 Alternative、右 Term、後続がいずれも選択点を持つ場合、右 Term の次の選択へ進む前に後続内の全選択が試され、左 Alternative の次の選択へ進む前に右 Term の全選択が試される。directionbackward のとき、AlternativeTerm の評価順序は逆転する。

Term :: Assertion
  1. Assertion の CompileAssertion (引数 rer) を返す。
Note 4

得られる Matcherdirection に依存しない。

Term :: Atom
  1. Atom の CompileAtom (引数 rer, direction) を返す。
Term :: Atom Quantifier
  1. mAtom の CompileAtom (引数 rer, direction) とする。
  2. qQuantifier の CompileQuantifier とする。
  3. アサート: q.[[Min]]q.[[Max]].
  4. parenIndex を CountLeftCapturingParensBefore(Term) とする。
  5. parenCount を CountLeftCapturingParensWithin(Atom) とする。
  6. (x, c) を引数に取り m, q, parenIndex, parenCount を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. RepeatMatcher(m, q.[[Min]], q.[[Max]], q.[[Greedy]], x, c, parenIndex, parenCount) を返す。

22.2.2.3.1 RepeatMatcher ( m, min, max, greedy, x, c, parenIndex, parenCount )

The abstract operation RepeatMatcher takes arguments m (a Matcher), min (非負整数), max (非負整数 または +∞), greedy (Boolean), x (MatchState), c (MatcherContinuation), parenIndex (非負整数), and parenCount (非負整数) and returns MatchState または failure. It performs the following steps when called:

  1. max = 0 なら c(x) を返す。
  2. (y) を引数に取り m, min, max, greedy, x, c, parenIndex, parenCount を捕捉し以下を行う新しい MatcherContinuation d を作る:
    1. アサート: yMatchState
    2. min = 0 かつ y.[[EndIndex]] = x.[[EndIndex]] なら failure を返す。
    3. min = 0 なら min2 を 0、そうでなければ min - 1。
    4. max = +∞ なら max2 を +∞、そうでなければ max - 1。
    5. RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) を返す。
  3. capx.[[Captures]] のコピーとする。
  4. parenIndex + 1 から parenIndex + parenCount までの各整数 k について cap[k] に undefined を設定する。
  5. Inputx.[[Input]] とする。
  6. ex.[[EndIndex]] とする。
  7. xrMatchState { [[Input]]: Input, [[EndIndex]]: e, [[Captures]]: cap } とする。
  8. min ≠ 0 なら m(xr, d) を返す。
  9. greedyfalse なら
    1. zc(x) とする。
    2. zfailure でなければ z を返す。
    3. m(xr, d) を返す。
  10. zm(xr, d) とする。
  11. zfailure でなければ z を返す。
  12. c(x) を返す。
Note 1

AtomQuantifier が続く場合、Quantifier に指定された回数だけ繰り返される。Quantifier は非貪欲 (non-greedy) の場合、後続にマッチしつつ可能な限り少ない回数繰り返され、貪欲 (greedy) の場合、後続にマッチしつつ可能な限り多く繰り返される。繰り返されるのは入力文字列ではなく Atom パターンであるため、各反復で異なる入力部分文字列にマッチし得る。

Note 2

Atom と後続の正規表現がいずれも選択点を持つ場合、まず Atom は可能な限り多く (非貪欲なら少なく) マッチする。後続内の全選択が試されてから、Atom の最後の反復で次の選択へ進む。最後 (n 回目) の反復の全選択が試されてから (n - 1) 回目の反復で次の選択へ進む。その時点で Atom の反復回数を増減できる可能性があり(再度、少ないか多いかから開始)、それらが尽きてから (n - 1) 回目の反復で次の選択へ進む……。

比較:

/a[a-z]{2,4}/.exec("abcdefghi")

"abcde" を返し、

/a[a-z]{2,4}?/.exec("abcdefghi")

"abc" を返す。

さらに:

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

は選択点の順序により配列

["aaba", "ba"]

を返し、以下ではない:

["aabaac", "aabaac"]
["aabaac", "c"]

この選択点の順序は、単項表記の 2 つの数の最大公約数 (GCD) を計算する正規表現を書くのに利用できる。以下は 10 と 15 の gcd を計算する例:

"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")

結果は単項表記の "aaaaa"

Note 3

RepeatMatcher のステップ Atom が繰り返されるたびにその捕捉をクリアする。次の正規表現で挙動が分かる:

/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")

これは配列

["zaacbbbcac", "z", "ac", "a", undefined, "c"]

を返し、

["zaacbbbcac", "z", "ac", "a", "bbb", "c"]

ではない。これは外側の * の各反復が量指定された Atom に含まれる全捕捉文字列(ここでは 2, 3, 4, 5 番)をクリアするためである。

Note 4

RepeatMatcher のステップ は、最小反復回数が満たされた後、空文字列にマッチする Atom のさらなる展開は追加反復として考慮しないと述べる。これは以下のようなパターンで無限ループに陥るのを防ぐ:

/(a*)*/.exec("b")

またはやや複雑な:

/(a*)b\1+/.exec("baaaac")

これは配列

["b", ""]

を返す。

22.2.2.3.2 EmptyMatcher ( )

The abstract operation EmptyMatcher takes no arguments and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り何も捕捉せず以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. c(x) を返す。

22.2.2.3.3 MatchTwoAlternatives ( m1, m2 )

The abstract operation MatchTwoAlternatives takes arguments m1 (Matcher) and m2 (Matcher) and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. rm1(x, c) とする。
    4. rfailure でなければ r を返す。
    5. m2(x, c) を返す。

22.2.2.3.4 MatchSequence ( m1, m2, direction )

The abstract operation MatchSequence takes arguments m1 (Matcher), m2 (Matcher), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. directionforward なら
    1. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
      1. アサート: xMatchState
      2. アサート: cMatcherContinuation
      3. (y) を引数に取り c, m2 を捕捉し以下を行う新しい MatcherContinuation d を作る:
        1. アサート: yMatchState
        2. m2(y, c) を返す。
      4. m1(x, d) を返す。
  2. それ以外
    1. アサート: directionbackward
    2. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
      1. アサート: xMatchState
      2. アサート: cMatcherContinuation
      3. (y) を引数に取り c, m1 を捕捉し以下を行う新しい MatcherContinuation d を作る:
        1. アサート: yMatchState
        2. m1(y, c) を返す。
      4. m2(x, d) を返す。

22.2.2.4 実行時セマンティクス: CompileAssertion : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.6 で修正される。

It is defined piecewise over the following productions:

Assertion :: ^
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. e = 0 または rer.[[Multiline]]true かつ 文字 Input[e - 1] が LineTerminator にマッチするなら
      1. c(x) を返す。
    6. failure を返す。
Note 2

y フラグがパターンに使われている場合でも、^ は常に Input の先頭、または (rer.[[Multiline]]true の場合) 行頭にのみマッチする。

Assertion :: $
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. InputLengthInput の要素数とする。
    6. e = InputLength または rer.[[Multiline]]true かつ 文字 Input[e] が LineTerminator にマッチするなら
      1. c(x) を返す。
    7. failure を返す。
Assertion :: \b
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. aIsWordChar(rer, Input, e - 1) とする。
    6. bIsWordChar(rer, Input, e) とする。
    7. (atrue かつ bfalse) または (afalse かつ btrue) なら c(x) を返す。
    8. failure を返す。
Assertion :: \B
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. aIsWordChar(rer, Input, e - 1) とする。
    6. bIsWordChar(rer, Input, e) とする。
    7. (atrue かつ btrue) または (afalse かつ bfalse) なら c(x) を返す。
    8. failure を返す。
Assertion :: (?= Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない新しい MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure なら failure を返す。
    6. アサート: rMatchState
    7. capr.[[Captures]] とする。
    8. Inputx.[[Input]] とする。
    9. xex.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. c(z) を返す。
Note 3

(?= Disjunction ) 形式はゼロ幅正の先読み。成功するには Disjunction 内のパターンが現在位置でマッチしなければならないが、後続をマッチする前に現在位置は進まない。Disjunction が現在位置で複数のマッチ方法を持つ場合、最初の 1 つのみ試す。他の演算子と異なり、(?= 形式内へのバックトラッキングは行われない (Perl 由来)。これは Disjunction が捕捉括弧を含み、パターン後続がそれらへの後方参照を含む場合のみ影響する。

例:

/(?=(a+))/.exec("baaabac")

は最初の b の直後で空文字列にマッチし、配列:

["", "aaa"]

を返す。先読み内へのバックトラッキング欠如を示すため:

/(?=(a+))a*b\1/.exec("baaabac")

["aba", "a"]

を返し、

["aaaba", "a"]

ではない。

Assertion :: (?! Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure でなければ failure を返す。
    6. c(x) を返す。
Note 4

(?! Disjunction ) 形式はゼロ幅負の先読み。成功には Disjunction 内のパターンが現在位置でマッチに失敗する必要がある。現在位置は後続をマッチする前に進まない。Disjunction は捕捉括弧を含み得るが、それらへの後方参照は Disjunction 内部でのみ意味を持つ。この負の先読みが成功するには失敗が必要であり、負の先読み外からのその捕捉への後方参照は常に undefined を返す。例:

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

は「a の直後に n (>0) 個の a、b、さらに n 個の a (\2)、c」が続かない a を探す。2 つ目の \2 は負の先読みの外なので undefined にマッチし常に成功する。式は配列:

["baaabaac", "ba", undefined, "abaac"]

を返す。

Assertion :: (?<= Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, backward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure なら failure を返す。
    6. アサート: rMatchState
    7. capr.[[Captures]] とする。
    8. Inputx.[[Input]] とする。
    9. xex.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. c(z) を返す。
Assertion :: (?<! Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, backward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure でなければ failure を返す。
    6. c(x) を返す。

22.2.2.4.1 IsWordChar ( rer, Input, e )

The abstract operation IsWordChar takes arguments rer (a RegExp Record), Input (文字の List), and e (整数) and returns Boolean. It performs the following steps when called:

  1. InputLengthInput の要素数とする。
  2. e = -1 または e = InputLength なら false を返す。
  3. cInput[e] の文字とする。
  4. WordCharacters(rer) に c が含まれるなら true を返す。
  5. false を返す。

22.2.2.5 実行時セマンティクス: CompileQuantifier を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Quantifier :: QuantifierPrefix
  1. qpQuantifierPrefix の CompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: true } を返す。
Quantifier :: QuantifierPrefix ?
  1. qpQuantifierPrefix の CompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: false } を返す。

22.2.2.6 実行時セマンティクス: CompileQuantifierPrefix を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

QuantifierPrefix :: *
  1. Record { [[Min]]: 0, [[Max]]: +∞ } を返す。
QuantifierPrefix :: +
  1. Record { [[Min]]: 1, [[Max]]: +∞ } を返す。
QuantifierPrefix :: ?
  1. Record { [[Min]]: 0, [[Max]]: 1 } を返す。
QuantifierPrefix :: { DecimalDigits }
  1. iDecimalDigits の MV (12.9.3 参照) とする。
  2. Record { [[Min]]: i, [[Max]]: i } を返す。
QuantifierPrefix :: { DecimalDigits ,}
  1. iDecimalDigits の MV とする。
  2. Record { [[Min]]: i, [[Max]]: +∞ } を返す。
QuantifierPrefix :: { DecimalDigits , DecimalDigits }
  1. i を最初の DecimalDigits の MV とする。
  2. j を 2 番目の DecimalDigits の MV とする。
  3. Record { [[Min]]: i, [[Max]]: j } を返す。

22.2.2.7 実行時セマンティクス: CompileAtom : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.7 で修正される。

It is defined piecewise over the following productions:

Atom :: PatternCharacter
  1. chPatternCharacter にマッチした文字とする。
  2. A を文字 ch を含む 1 要素 CharSet とする。
  3. CharacterSetMatcher(rer, A, false, direction) を返す。
Atom :: .
  1. AAllCharacters(rer) とする。
  2. rer.[[DotAll]]true でなければ
    1. LineTerminator 生成規則右辺のコードポイントに対応する全ての文字を A から除去する。
  3. CharacterSetMatcher(rer, A, false, direction) を返す。
Atom :: CharacterClass
  1. ccCharacterClass の CompileCharacterClass (引数 rer) とする。
  2. cscc.[[CharSet]] とする。
  3. rer.[[UnicodeSets]]false または cs の全 CharSetElement が単一文字(cs が空の場合を含む)から成るなら CharacterSetMatcher(rer, cs, cc.[[Invert]], direction) を返す。
  4. アサート: cc.[[Invert]]false
  5. lm を空の MatcherList とする。
  6. cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:
    1. cs2s の最後のコードポイントを含む 1 要素 CharSet とする。
    2. m2CharacterSetMatcher(rer, cs2, false, direction)。
    3. s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:
      1. cs1c1 を含む 1 要素 CharSet とする。
      2. m1CharacterSetMatcher(rer, cs1, false, direction)。
      3. m2MatchSequence(m1, m2, direction) に更新。
    4. m2lm に追加。
  7. singlescs のうち単一文字から成る全 CharSetElement を含む CharSet とする。
  8. CharacterSetMatcher(rer, singles, false, direction) を lm に追加。
  9. cs が空文字列を含むなら EmptyMatcher() を lm に追加。
  10. m2lm の最後の Matcher とする。
  11. lm の 2 番目から最後の要素を逆順に各 Matcher m1 について
    1. m2MatchTwoAlternatives(m1, m2) に更新。
  12. m2 を返す。
Atom :: ( GroupSpecifieropt Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, direction) とする。
  2. parenIndex を CountLeftCapturingParensBefore(Atom) とする。
  3. (x, c) を引数に取り direction, m, parenIndex を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り x, c, direction, parenIndex を捕捉し以下を行う新しい MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. capy.[[Captures]] のコピーとする。
      3. Inputx.[[Input]] とする。
      4. xex.[[EndIndex]] とする。
      5. yey.[[EndIndex]] とする。
      6. directionforward なら
        1. アサート: xeye
        2. rCaptureRange { [[StartIndex]]: xe, [[EndIndex]]: ye } とする。
      7. それ以外
        1. アサート: directionbackward
        2. アサート: yexe
        3. rCaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe } とする。
      8. cap[parenIndex + 1] に r を設定。
      9. zMatchState { [[Input]]: Input, [[EndIndex]]: ye, [[Captures]]: cap } とする。
      10. c(z) を返す。
    4. m(x, d) を返す。
Note 2

( Disjunction ) 形式の括弧は Disjunction パターンの構成要素をグループ化し、マッチ結果を保存する。結果は後方参照(\ + 非ゼロ 10 進数)、置換文字列で参照、または正規表現マッチ抽象クロージャが返す配列の一部として利用できる。捕捉挙動を抑止するには (?: Disjunction ) を用いる。

Atom :: (? RegularExpressionModifiers : Disjunction )
  1. addModifiersRegularExpressionModifiers にマッチしたソーステキストとする。
  2. removeModifiers を空文字列とする。
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), removeModifiers) とする。
  4. Disjunction の CompileSubpattern (引数 modifiedRer, direction) を返す。
Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction )
  1. addModifiers を最初の RegularExpressionModifiers にマッチしたソーステキストとする。
  2. removeModifiers を 2 番目の RegularExpressionModifiers にマッチしたソーステキストとする。
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), CodePointsToString(removeModifiers)) とする。
  4. Disjunction の CompileSubpattern (引数 modifiedRer, direction) を返す。
AtomEscape :: DecimalEscape
  1. nDecimalEscape の CapturingGroupNumber とする。
  2. アサート: nrer.[[CapturingGroupsCount]]
  3. BackreferenceMatcher(rer, « n », direction) を返す。
Note 3

\ に非ゼロ 10 進数 n が続くエスケープは n 番目の捕捉括弧集合の結果にマッチする (22.2.2.1)。正規表現内の捕捉括弧数が n 未満ならエラー。n 以上あるが n 番目が何も捕捉せず undefined なら後方参照は常に成功する。

AtomEscape :: CharacterEscape
  1. cvCharacterEscape の CharacterValue とする。
  2. ch を character value が cv の文字とする。
  3. A を文字 ch を含む 1 要素 CharSet とする。
  4. CharacterSetMatcher(rer, A, false, direction) を返す。
AtomEscape :: CharacterClassEscape
  1. csCharacterClassEscape の CompileToCharSet (引数 rer) とする。
  2. rer.[[UnicodeSets]]false または cs の全 CharSetElement が単一文字(cs が空の場合含む)から成るなら CharacterSetMatcher(rer, cs, false, direction) を返す。
  3. lm を空の MatcherList とする。
  4. cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:
    1. cs2s の最後のコードポイントを含む 1 要素 CharSet とする。
    2. m2CharacterSetMatcher(rer, cs2, false, direction)。
    3. s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:
      1. cs1c1 を含む 1 要素 CharSet
      2. m1CharacterSetMatcher(rer, cs1, false, direction)。
      3. m2MatchSequence(m1, m2, direction) に更新。
    4. m2lm に追加。
  5. singlescs のうち単一文字から成る全 CharSetElement を含む CharSet とする。
  6. CharacterSetMatcher(rer, singles, false, direction) を lm に追加。
  7. cs が空文字列を含むなら EmptyMatcher() を lm に追加。
  8. m2lm の最後の Matcher に。
  9. lm の 2 番目から最後の要素を逆順に各 m1 について
    1. m2MatchTwoAlternatives(m1, m2) に更新。
  10. m2 を返す。
AtomEscape :: k GroupName
  1. matchingGroupSpecifiers を GroupSpecifiersThatMatch(GroupName) とする。
  2. parenIndices を新しい空 List とする。
  3. matchingGroupSpecifiers の各 GroupSpecifier groupSpecifier について
    1. parenIndex を CountLeftCapturingParensBefore(groupSpecifier) とする。
    2. parenIndexparenIndices に追加。
  4. BackreferenceMatcher(rer, parenIndices, direction) を返す。

22.2.2.7.1 CharacterSetMatcher ( rer, A, invert, direction )

The abstract operation CharacterSetMatcher takes arguments rer (a RegExp Record), A (CharSet), invert (Boolean), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. rer.[[UnicodeSets]]true なら
    1. アサート: invertfalse
    2. アサート: A の全 CharSetElement は単一文字。
  2. (x, c) を引数に取り rer, A, invert, direction を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. directionforward なら fe + 1 とし、そうでなければ fe - 1。
    6. InputLengthInput の要素数とする。
    7. f < 0 または f > InputLength なら failure
    8. indexmin(e, f) とする。
    9. chInput[index] の文字とする。
    10. ccCanonicalize(rer, ch) とする。
    11. A 内に正確に 1 文字 a を含む CharSetElement が存在し、Canonicalize(rer, a) が cc なら foundtrue、そうでなければ false
    12. invertfalse かつ foundfalse なら failure
    13. inverttrue かつ foundtrue なら failure
    14. capx.[[Captures]] とする。
    15. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    16. c(y) を返す。

22.2.2.7.2 BackreferenceMatcher ( rer, ns, direction )

The abstract operation BackreferenceMatcher takes arguments rer (a RegExp Record), ns (正の整数List), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り rer, ns, direction を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. capx.[[Captures]] とする。
    5. rundefined とする。
    6. 整数 nns について
      1. cap[n] が undefined でなければ
        1. アサート: rundefined
        2. rcap[n] に設定。
    7. rundefined なら c(x) を返す。
    8. ex.[[EndIndex]] とする。
    9. rsr.[[StartIndex]] とする。
    10. rer.[[EndIndex]] とする。
    11. lenre - rs とする。
    12. directionforward なら fe + len、そうでなければ fe - len
    13. InputLengthInput の要素数とする。
    14. f < 0 または f > InputLength なら failure
    15. gmin(e, f) とする。
    16. 0 ≤ i < len整数 iCanonicalize(rer, Input[rs + i]) ≠ Canonicalize(rer, Input[g + i]) となるものが存在するなら failure
    17. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    18. c(y) を返す。

22.2.2.7.3 Canonicalize ( rer, ch )

The abstract operation Canonicalize takes arguments rer (a RegExp Record) and ch (文字) and returns 文字. It performs the following steps when called:

  1. HasEitherUnicodeFlag(rer) が true かつ rer.[[IgnoreCase]]true なら
    1. Unicode Character Database の CaseFolding.txtch に単純または共通のケースフォールディングを提供するなら、その写像結果を返す。
    2. ch を返す。
  2. rer.[[IgnoreCase]]false なら ch を返す。
  3. アサート: ch は UTF-16 コードユニット。
  4. cp を数値が ch の数値と等しいコードポイントとする。
  5. u を Unicode 既定ケース変換アルゴリズムに従い toUppercase(« cp ») とする。
  6. uStr を CodePointsToString(u) とする。
  7. uStr の長さ ≠ 1 なら ch を返す。
  8. cuuStr の単一コードユニット要素とする。
  9. ch の数値 ≥ 128 かつ cu の数値 < 128 なら ch を返す。
  10. cu を返す。
Note

HasEitherUnicodeFlag(rer) が true の大文字小文字無視マッチでは、比較直前に全ての文字が Unicode 標準の simple case folding により暗黙にフォールディングされる。simple mapping は常に単一コードポイントへ写像するため ßssSS には写らない。基本ラテンブロック外から内へ写像する場合がある (例: ſs, k)。これらを含む文字列は /[a-z]/ui などでマッチする。

HasEitherUnicodeFlag(rer) が false の大文字小文字無視マッチでは toCasefold ではなく toUppercase に基づくため差異がある。例: は toUppercase では自身、toCasefold では ω に写るため "\u2126"/[ω]/ui/[\u03A9]/ui にマッチするが /[ω]/i/[\u03A9]/i にはマッチしない。また基本ラテン外から内への写像は行われないので "\u017F ſ", "\u212A K"/[a-z]/i にマッチしない。

22.2.2.7.4 UpdateModifiers ( rer, add, remove )

The abstract operation UpdateModifiers takes arguments rer (a RegExp Record), add (String), and remove (String) and returns RegExp Record. It performs the following steps when called:

  1. アサート: addremove は共通要素を持たない。
  2. ignoreCaserer.[[IgnoreCase]]
  3. multilinerer.[[Multiline]]
  4. dotAllrer.[[DotAll]]
  5. unicoderer.[[Unicode]]
  6. unicodeSetsrer.[[UnicodeSets]]
  7. capturingGroupsCountrer.[[CapturingGroupsCount]]
  8. remove"i" が含まれるなら ignoreCasefalse に。
  9. そうでなく add"i" が含まれるなら ignoreCasetrue に。
  10. remove"m" が含まれるなら multilinefalse に。
  11. そうでなく add"m" が含まれるなら multilinetrue に。
  12. remove"s" が含まれるなら dotAllfalse に。
  13. そうでなく add"s" が含まれるなら dotAlltrue に。
  14. RegExp Record { [[IgnoreCase]]: ignoreCase, [[Multiline]]: multiline, [[DotAll]]: dotAll, [[Unicode]]: unicode, [[UnicodeSets]]: unicodeSets, [[CapturingGroupsCount]]: capturingGroupsCount } を返す。

22.2.2.8 実行時セマンティクス: CompileCharacterClass を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

CharacterClass :: [ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer) とする。
  2. Record { [[CharSet]]: A, [[Invert]]: false } を返す。
CharacterClass :: [^ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer) とする。
  2. rer.[[UnicodeSets]]true なら
    1. Record { [[CharSet]]: CharacterComplement(rer, A), [[Invert]]: false } を返す。
  3. Record { [[CharSet]]: A, [[Invert]]: true } を返す。

22.2.2.9 実行時セマンティクス: CompileToCharSet : CharSet

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.8 で修正される。

It is defined piecewise over the following productions:

ClassContents :: [empty]
  1. 空の CharSet を返す。
NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash
  1. AClassAtom の CompileToCharSet (引数 rer)。
  2. BNonemptyClassRangesNoDash の CompileToCharSet (引数 rer)。
  3. CharSet AB の和集合を返す。
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. A を最初の ClassAtom の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassAtom の CompileToCharSet (引数 rer)。
  3. CClassContents の CompileToCharSet (引数 rer)。
  4. DCharacterRange(A, B)。
  5. DC の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash
  1. AClassAtomNoDash の CompileToCharSet (引数 rer)。
  2. BNonemptyClassRangesNoDash の CompileToCharSet (引数 rer)。
  3. CharSet AB の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. AClassAtomNoDash の CompileToCharSet (引数 rer)。
  2. BClassAtom の CompileToCharSet (引数 rer)。
  3. CClassContents の CompileToCharSet (引数 rer)。
  4. DCharacterRange(A, B)。
  5. DC の和集合を返す。
Note 2

ClassContents は単一の ClassAtom、およびダッシュで区切られた 2 つの ClassAtom の範囲になり得る。後者の場合、ClassContents には第 1 と第 2 の ClassAtom 間(含む)の全ての文字が含まれる。どちらかの ClassAtom が単一文字を表さない (例: \w) 場合、または第 1 の ClassAtom の character value が第 2 のそれより大きい場合はエラー。

Note 3

パターンが大文字小文字を無視する場合でも、範囲両端の大文字小文字は範囲に含まれる文字を決定する上で重要。例: /[E-F]/iE, F, e, f のみ、/[E-f]/i は Unicode Basic Latin ブロックの全大文字小文字および [, \, ], ^, _, ` にマッチ。

Note 4

- は文字通りにも範囲指定にも使える。ClassContents の先頭または末尾、範囲指定の開始/終了端、または範囲指定直後に現れる場合はリテラルとして扱われる。

ClassAtom :: -
  1. 単一文字 - U+002D (HYPHEN-MINUS) を含む CharSet を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. SourceCharacter にマッチした文字を含む CharSet を返す。
ClassEscape :: b - CharacterEscape
  1. cv をこの ClassEscape の CharacterValue。
  2. c を character value が cv の文字。
  3. c を含む 1 要素 CharSet を返す。
Note 5

ClassAtom 内では、\b, \B, 後方参照を除く正規表現中で許されるエスケープを利用できる。CharacterClass 内では \b はバックスペース文字、\B と後方参照はエラー。ClassAtom 内で後方参照を用いるとエラー。

CharacterClassEscape :: d
  1. 文字 09 を含む 10 要素 CharSet を返す。
CharacterClassEscape :: D
  1. S CharacterClassEscape :: d の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: s
  1. WhiteSpace または LineTerminator 生成規則右辺のコードポイントに対応する全ての文字を含む CharSet を返す。
CharacterClassEscape :: S
  1. S CharacterClassEscape :: s の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: w
  1. MaybeSimpleCaseFolding(rer, WordCharacters(rer)) を返す。
CharacterClassEscape :: W
  1. S CharacterClassEscape :: w の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: p{ UnicodePropertyValueExpression }
  1. UnicodePropertyValueExpression の CompileToCharSet (引数 rer) を返す。
CharacterClassEscape :: P{ UnicodePropertyValueExpression }
  1. SUnicodePropertyValueExpression の CompileToCharSet (引数 rer) とする。
  2. アサート: S は単一コードポイントのみ含む。
  3. CharacterComplement(rer, S) を返す。
UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue
  1. psUnicodePropertyName にマッチしたソーステキスト。
  2. pUnicodeMatchProperty(rer, ps)。
  3. アサート: pTable 67 の「Property name and aliases」に列挙される Unicode プロパティ名またはエイリアス。
  4. vsUnicodePropertyValue にマッチしたソーステキスト。
  5. vUnicodeMatchPropertyValue(p, vs)。
  6. A をプロパティ p が値 v を持つ全 Unicode コードポイントを含む CharSet
  7. MaybeSimpleCaseFolding(rer, A) を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. sLoneUnicodePropertyNameOrValue にマッチしたソーステキスト。
  2. UnicodeMatchPropertyValue(General_Category, s) が General_Category (gc) のプロパティ値または値エイリアス(PropertyValueAliases.txt)なら
    1. プロパティ “General_Category” が値 s を持つ全 Unicode コードポイントを含む CharSet を返す。
  3. pUnicodeMatchProperty(rer, s)。
  4. アサート: pTable 68 の「Property name and aliases」列、または Table 69 の「Property name」列に列挙されるバイナリ Unicode プロパティ / そのエイリアス / 文字列のバイナリプロパティ。
  5. A をプロパティ p が値 “True” を持つ全 CharSetElement を含む CharSet
  6. MaybeSimpleCaseFolding(rer, A) を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. AClassSetRange の CompileToCharSet (引数 rer)。
  2. ClassUnion が存在するなら
    1. BClassUnion の CompileToCharSet (引数 rer)。
    2. CharSet AB の和集合を返す。
  3. A を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. AClassSetOperand の CompileToCharSet (引数 rer)。
  2. ClassUnion が存在するなら
    1. BClassUnion の CompileToCharSet (引数 rer)。
    2. CharSet AB の和集合を返す。
  3. A を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. A を最初の ClassSetOperand の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassSetOperand の CompileToCharSet (引数 rer)。
  3. CharSet AB の共通部分を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. AClassIntersection の CompileToCharSet (引数 rer)。
  2. BClassSetOperand の CompileToCharSet (引数 rer)。
  3. CharSet AB の共通部分を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 最初の ClassSetOperand の CompileToCharSet (引数 rer) を A
  2. 2 番目の ClassSetOperand の CompileToCharSet (引数 rer) を B
  3. A のうち B でない CharSetElement を含む CharSet を返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. AClassSubtraction の CompileToCharSet (引数 rer)。
  2. BClassSetOperand の CompileToCharSet (引数 rer)。
  3. A のうち B でない CharSetElement を含む CharSet を返す。
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  1. A を最初の ClassSetCharacter の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassSetCharacter の CompileToCharSet (引数 rer)。
  3. MaybeSimpleCaseFolding(rer, CharacterRange(A, B)) を返す。
Note 6

結果はしばしば 2 個以上の範囲で構成される。UnicodeSets が true かつ IgnoreCase が true のとき、MaybeSimpleCaseFolding(rer, [Ā-č]) はその範囲の奇数番コードポイントのみを含む。

ClassSetOperand :: ClassSetCharacter
  1. AClassSetCharacter の CompileToCharSet (引数 rer)。
  2. MaybeSimpleCaseFolding(rer, A) を返す。
ClassSetOperand :: ClassStringDisjunction
  1. AClassStringDisjunction の CompileToCharSet (引数 rer)。
  2. MaybeSimpleCaseFolding(rer, A) を返す。
ClassSetOperand :: NestedClass
  1. NestedClass の CompileToCharSet (引数 rer) を返す。
NestedClass :: [ ClassContents ]
  1. ClassContents の CompileToCharSet (引数 rer) を返す。
NestedClass :: [^ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer)。
  2. CharacterComplement(rer, A) を返す。
NestedClass :: \ CharacterClassEscape
  1. CharacterClassEscape の CompileToCharSet (引数 rer) を返す。
ClassStringDisjunction :: \q{ ClassStringDisjunctionContents }
  1. ClassStringDisjunctionContents の CompileToCharSet (引数 rer) を返す。
ClassStringDisjunctionContents :: ClassString
  1. sClassString の CompileClassSetString (引数 rer)。
  2. 文字列 s を 1 つだけ含む CharSet を返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. sClassString の CompileClassSetString (引数 rer)。
  2. A を文字列 s を 1 つ含む CharSet
  3. BClassStringDisjunctionContents の CompileToCharSet (引数 rer)。
  4. CharSet AB の和集合を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape \ ClassSetReservedPunctuator
  1. cv をこの ClassSetCharacter の CharacterValue。
  2. c を character value が cv の文字。
  3. c を含む 1 要素 CharSet を返す。
ClassSetCharacter :: \b
  1. U+0008 (BACKSPACE) を含む 1 要素 CharSet を返す。

22.2.2.9.1 CharacterRange ( A, B )

The abstract operation CharacterRange takes arguments A (CharSet) and B (CharSet) and returns CharSet. It performs the following steps when called:

  1. アサート: A, B はそれぞれ正確に 1 文字を含む。
  2. aCharSet A の唯一の文字。
  3. bCharSet B の唯一の文字。
  4. i を文字 a の character value。
  5. j を文字 b の character value。
  6. アサート: ij
  7. i から j まで(含む)の character value を持つ全ての文字を含む CharSet を返す。

22.2.2.9.2 HasEitherUnicodeFlag ( rer )

The abstract operation HasEitherUnicodeFlag takes argument rer (a RegExp Record) and returns Boolean. It performs the following steps when called:

  1. rer.[[Unicode]]true または rer.[[UnicodeSets]]true なら
    1. true を返す。
  2. false を返す。

22.2.2.9.3 WordCharacters ( rer )

The abstract operation WordCharacters takes argument rer (a RegExp Record) and returns CharSet. \b, \B, \w, \W のために「word characters」と見なされる文字を含む CharSet を返す。 It performs the following steps when called:

  1. basicWordChars を ASCII の word characters 全てを含む CharSet
  2. extraWordChars を、basicWordChars には含まれないが Canonicalize(rer, c) が basicWordChars に含まれる全ての文字 c を含む CharSet
  3. アサート: HasEitherUnicodeFlag(rer) が true かつ rer.[[IgnoreCase]]true でない限り extraWordChars は空。
  4. basicWordCharsextraWordChars の和集合を返す。

22.2.2.9.4 AllCharacters ( rer )

The abstract operation AllCharacters takes argument rer (a RegExp Record) and returns CharSet. 正規表現フラグに従う「全ての文字」の集合を返す。 It performs the following steps when called:

  1. rer.[[UnicodeSets]]true かつ rer.[[IgnoreCase]]true なら
    1. Simple Case Folding を持たない (scf(c) = c) 全 Unicode コードポイント c を含む CharSet を返す。
  2. それ以外で HasEitherUnicodeFlag(rer) が true なら
    1. 全コードポイント値を含む CharSet を返す。
  3. それ以外
    1. 全コードユニット値を含む CharSet を返す。

22.2.2.9.5 MaybeSimpleCaseFolding ( rer, A )

The abstract operation MaybeSimpleCaseFolding takes arguments rer (a RegExp Record) and A (CharSet) and returns CharSet. rer.[[UnicodeSets]]false または rer.[[IgnoreCase]]false なら A を返す。そうでなければ Simple Case Folding (scf(cp)) の定義 (CaseFolding.txt) を用い、A の各 CharSetElement を文字ごとに正規化して得られる CharSet を返す。 It performs the following steps when called:

  1. rer.[[UnicodeSets]]false または rer.[[IgnoreCase]]false なら A を返す。
  2. B を新しい空の CharSet
  3. A の各 CharSetElement s について
    1. t を空の文字列シーケンス。
    2. s 内の各単一コードポイント cp について
      1. scf(cp) を t に追加。
    3. tB に追加。
  4. B を返す。

22.2.2.9.6 CharacterComplement ( rer, S )

The abstract operation CharacterComplement takes arguments rer (a RegExp Record) and S (CharSet) and returns CharSet. It performs the following steps when called:

  1. AAllCharacters(rer)。
  2. A のうち S に含まれない CharSetElement を含む CharSet を返す。

22.2.2.9.7 UnicodeMatchProperty ( rer, p )

The abstract operation UnicodeMatchProperty takes arguments rer (a RegExp Record) and p (ECMAScript source text) and returns Unicode プロパティ名. It performs the following steps when called:

  1. rer.[[UnicodeSets]]true かつ pTable 69 の「Property name」列にある Unicode property name なら
    1. Unicode コードポイント列 pList を返す。
  2. アサート: pTable 67 または Table 68 の「Property name and aliases」列に列挙される Unicode property name またはエイリアス。
  3. c を対応行の “Canonical property name” 列にある正規 property name
  4. Unicode コードポイント列 cList を返す。

実装は Table 67Table 68Table 69 に列挙される Unicode プロパティ名とエイリアスをサポートしなければならない。相互運用性確保のため、それ以外をサポートしてはならない。

Note 1

例: Script_Extensions (プロパティ名) と scx (エイリアス) は有効だが script_extensionsScx は無効。

Note 2

列挙プロパティは UTS18 RL1.2 要求のスーパーセット。

Note 3

表中の綴り (大小含む) は Unicode Character Database の PropertyAliases.txt の綴りと一致し、その正確な綴りは 安定性が保証 されている。

Table 67: Non-binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
General_Category General_Category
gc
Script Script
sc
Script_Extensions Script_Extensions
scx
Table 68: Binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
ASCII ASCII
ASCII_Hex_Digit ASCII_Hex_Digit
AHex
Alphabetic Alphabetic
Alpha
Any Any
Assigned Assigned
Bidi_Control Bidi_Control
Bidi_C
Bidi_Mirrored Bidi_Mirrored
Bidi_M
Case_Ignorable Case_Ignorable
CI
Cased Cased
Changes_When_Casefolded Changes_When_Casefolded
CWCF
Changes_When_Casemapped Changes_When_Casemapped
CWCM
Changes_When_Lowercased Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased Changes_When_Titlecased
CWT
Changes_When_Uppercased Changes_When_Uppercased
CWU
Dash Dash
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
EComp
Emoji_Modifier Emoji_Modifier
EMod
Emoji_Modifier_Base Emoji_Modifier_Base
EBase
Emoji_Presentation Emoji_Presentation
EPres
Extended_Pictographic Extended_Pictographic
ExtPict
Extender Extender
Ext
Grapheme_Base Grapheme_Base
Gr_Base
Grapheme_Extend Grapheme_Extend
Gr_Ext
Hex_Digit Hex_Digit
Hex
IDS_Binary_Operator IDS_Binary_Operator
IDSB
IDS_Trinary_Operator IDS_Trinary_Operator
IDST
ID_Continue ID_Continue
IDC
ID_Start ID_Start
IDS
Ideographic Ideographic
Ideo
Join_Control Join_Control
Join_C
Logical_Order_Exception Logical_Order_Exception
LOE
Lowercase Lowercase
Lower
Math Math
Noncharacter_Code_Point Noncharacter_Code_Point
NChar
Pattern_Syntax Pattern_Syntax
Pat_Syn
Pattern_White_Space Pattern_White_Space
Pat_WS
Quotation_Mark Quotation_Mark
QMark
Radical Radical
Regional_Indicator Regional_Indicator
RI
Sentence_Terminal Sentence_Terminal
STerm
Soft_Dotted Soft_Dotted
SD
Terminal_Punctuation Terminal_Punctuation
Term
Unified_Ideograph Unified_Ideograph
UIdeo
Uppercase Uppercase
Upper
Variation_Selector Variation_Selector
VS
White_Space White_Space
space
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS
Table 69: Binary Unicode properties of strings
Property name
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji

22.2.2.9.8 UnicodeMatchPropertyValue ( p, v )

The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScript source text) and v (ECMAScript source text) and returns Unicode プロパティ値. It performs the following steps when called:

  1. アサート: pTable 67 の “Canonical property name” 列に列挙される正規・非エイリアス Unicode プロパティ名
  2. アサート: vPropertyValueAliases.txt に列挙される Unicode プロパティ p のプロパティ値または値エイリアス。
  3. value を対応行の “Canonical property value” 列にある正規プロパティ値。
  4. Unicode コードポイント列 valueList を返す。

実装は Table 67 に列挙されるプロパティについて、PropertyValueAliases.txt に列挙される Unicode プロパティ値および値エイリアスをサポートしなければならない。相互運用性確保のため、それ以外の値・エイリアスをサポートしてはならない。

Note 1

例: XpeoOld_Persian は有効な Script_Extensions 値だが xpeoOld Persian は無効。

Note 2

このアルゴリズムは UAX44 の symbolic 値マッチ規則 と異なり、大小・空白・U+002D (HYPHEN-MINUS)・U+005F (LOW LINE) を無視せず、Is 接頭辞をサポートしない。

22.2.2.10 実行時セマンティクス: CompileClassSetString : 文字列シーケンス

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassString :: [empty]
  1. 空の文字列シーケンスを返す。
ClassString :: NonEmptyClassString
  1. NonEmptyClassString の CompileClassSetString (引数 rer) を返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. csClassSetCharacter の CompileToCharSet (引数 rer) とする。
  2. s1cs の単一 CharSetElement である文字列シーケンスとする。
  3. NonEmptyClassString が存在するなら
    1. s2NonEmptyClassString の CompileClassSetString (引数 rer)。
    2. s1s2 の連結を返す。
  4. s1 を返す。

22.2.3 RegExp 生成のための抽象操作

22.2.3.1 RegExpCreate ( P, F )

The abstract operation RegExpCreate takes arguments P (ECMAScript 言語値) and F (String または undefined) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. obj を ! RegExpAlloc(%RegExp%) とする。
  2. RegExpInitialize(obj, P, F) を返す。

22.2.3.2 RegExpAlloc ( newTarget )

The abstract operation RegExpAlloc takes argument newTarget (constructor) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. obj を ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] ») とする。
  2. DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  3. obj を返す。

22.2.3.3 RegExpInitialize ( obj, pattern, flags )

The abstract operation RegExpInitialize takes arguments obj (オブジェクト), pattern (ECMAScript 言語値), and flags (ECMAScript 言語値) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. patternundefined なら P を空文字列とする。
  2. そうでなければ P を ? ToString(pattern) とする。
  3. flagsundefined なら F を空文字列とする。
  4. そうでなければ F を ? ToString(flags) とする。
  5. F"d", "g", "i", "m", "s", "u", "v", "y" 以外のコードユニットを含むか、あるいは同じコードユニットを複数回含むなら SyntaxError 例外を投げる。
  6. F"i" を含むなら itrue、そうでなければ false とする。
  7. F"m" を含むなら mtrue、そうでなければ false とする。
  8. F"s" を含むなら strue、そうでなければ false とする。
  9. F"u" を含むなら utrue、そうでなければ false とする。
  10. F"v" を含むなら vtrue、そうでなければ false とする。
  11. utrue もしくは vtrue の場合
    1. patternText を StringToCodePoints(P) とする。
  12. そうでなければ
    1. patternTextP の各 16-bit 要素を Unicode BMP コードポイントとして解釈した結果とする (UTF-16 デコードは行わない)。
  13. parseResult を ParsePattern(patternText, u, v) とする。
  14. parseResult が空でない SyntaxError オブジェクトの List なら SyntaxError 例外を投げる。
  15. アサート: parseResultPattern パースノードである。
  16. obj.[[OriginalSource]]P を設定する。
  17. obj.[[OriginalFlags]]F を設定する。
  18. capturingGroupsCount を CountLeftCapturingParensWithin(parseResult) とする。
  19. rerRegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount } とする。
  20. obj.[[RegExpRecord]]rer を設定する。
  21. obj.[[RegExpMatcher]] に 引数 rerparseResult の CompilePattern を設定する。
  22. Set(obj, "lastIndex", +0𝔽, true) を実行する。
  23. obj を返す。

22.2.3.4 静的セマンティクス: ParsePattern ( patternText: Unicode コードポイント列, u: Boolean, v: Boolean, ): パースノードまたは空でない SyntaxError オブジェクト List

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.9 で修正される。

It performs the following steps when called:

  1. vtrue かつ utrue なら
    1. parseResult を 1 個以上の SyntaxError オブジェクトを含む List とする。
  2. そうでなく vtrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups]) とする。
  3. そうでなく utrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  4. それ以外
    1. parseResult を ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  5. parseResult を返す。

22.2.4 RegExp コンストラクター

RegExp コンストラクター:

  • %RegExp% である。
  • グローバルオブジェクト"RegExp" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき新しい RegExp オブジェクトを生成し初期化する。
  • 関数として呼び出された場合、新しい RegExp オブジェクトを返すか、引数が RegExp オブジェクト 1 つのみならその引数自体を返す。
  • クラス定義の extends 句の値として使用できる。指定された RegExp の挙動を継承するサブクラスのコンストラクターは、必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため RegExp コンストラクターへの super 呼び出しを含めなければならない。

22.2.4.1 RegExp ( pattern, flags )

この関数は呼び出し時に以下を行う:

  1. patternIsRegExp を ? IsRegExp(pattern) とする。
  2. NewTarget が undefined なら
    1. newTarget をアクティブな関数オブジェクトとする。
    2. patternIsRegExptrue かつ flagsundefined なら
      1. patternConstructor を ? Get(pattern, "constructor") とする。
      2. SameValue(newTarget, patternConstructor) が true なら pattern を返す。
  3. そうでなければ
    1. newTarget を NewTarget とする。
  4. pattern がオブジェクトで [[RegExpMatcher]] 内部スロットを持つなら
    1. Ppattern.[[OriginalSource]] とする。
    2. flagsundefined なら Fpattern.[[OriginalFlags]] とし、そうでなければ Fflags とする。
  5. そうでなく patternIsRegExptrue なら
    1. P を ? Get(pattern, "source") とする。
    2. flagsundefined なら
      1. F を ? Get(pattern, "flags") とする。
    3. そうでなければ
      1. Fflags とする。
  6. それ以外
    1. Ppattern とする。
    2. Fflags とする。
  7. O を ? RegExpAlloc(newTarget) とする。
  8. RegExpInitialize(O, P, F) を返す。
Note

pattern が StringLiteral で与えられる場合、通常のエスケープシーケンス置換が本関数で処理される前に適用される。pattern がこの関数に認識させるためにエスケープシーケンスを含む必要があるなら、StringLiteral 内で U+005C (REVERSE SOLIDUS) は削除されないようエスケープされなければならない。

22.2.5 RegExp コンストラクターのプロパティ

RegExp コンストラクター:

  • %Function.prototype%[[Prototype]] 内部スロットを持つ。
  • 以下のプロパティを持つ:

22.2.5.1 RegExp.escape ( S )

この関数は、正規表現 Pattern 内で特別な意味を持ち得る文字が等価なエスケープシーケンスに置換された S のコピーを返す。

呼び出し時に以下を行う:

  1. S が String でなければ TypeError 例外を投げる。
  2. escaped を空文字列とする。
  3. cpList を StringToCodePoints(S) とする。
  4. cpList の各コードポイント cp について
    1. escaped が空文字列でかつ cpDecimalDigit または AsciiLetter のいずれかにマッチするなら
      1. 注記: 先頭の数字をエスケープすることで、\0\1 などの DecimalEscape の後で文字列 S をマッチさせる際、前のエスケープシーケンス拡張と解釈されるのを防ぐ。先頭の ASCII 文字も \c の後の文脈で同様。
      2. numericValuecp の数値とする。
      3. hexNumber::toString(𝔽(numericValue), 16) とする。
      4. アサート: hex の長さは 2。
      5. escaped を 0x005C (REVERSE SOLIDUS), "x", hex の連結に設定する。
    2. そうでなければ
      1. escapedescapedEncodeForRegExpEscape(cp) の連結に設定する。
  5. escaped を返す。
Note

名前が類似していても EscapeRegExpPatternRegExp.escape は異なる働きをする。前者はパターンを文字列表現へエスケープし、後者は文字列をパターン内表現のためにエスケープする。

22.2.5.1.1 EncodeForRegExpEscape ( cp )

The abstract operation EncodeForRegExpEscape takes argument cp (コードポイント) and returns String. cp をマッチする Pattern 表現用 String を返す。cp が空白または ASCII 句読文字なら返値はエスケープシーケンス、それ以外は cp 自身の String 表現。 It performs the following steps when called:

  1. cpSyntaxCharacter にマッチするか、cp が U+002F (SOLIDUS) なら
    1. 0x005C (REVERSE SOLIDUS) と UTF16EncodeCodePoint(cp) の連結を返す。
  2. そうでなく cpTable 65 の “Code Point” 列に列挙されるコードポイントなら
    1. 0x005C (REVERSE SOLIDUS) と対応行の “ControlEscape” 列の文字列との連結を返す。
  3. otherPunctuators",-=<>#&!%:;@~'`" とコードユニット 0x0022 (QUOTATION MARK) の連結とする。
  4. toEscape を StringToCodePoints(otherPunctuators) とする。
  5. toEscapecp を含む、または cpWhiteSpace もしくは LineTerminator にマッチする、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つなら
    1. cpNumcp の数値とする。
    2. cpNum ≤ 0xFF なら
      1. hexNumber::toString(𝔽(cpNum), 16) とする。
      2. 0x005C (REVERSE SOLIDUS), "x", StringPad(hex, 2, "0", start) の連結を返す。
    3. escaped を空文字列とする。
    4. codeUnits を UTF16EncodeCodePoint(cp) とする。
    5. 各コードユニット cu について
      1. escapedescapedUnicodeEscape(cu) の連結にする。
    6. escaped を返す。
  6. UTF16EncodeCodePoint(cp) を返す。

22.2.5.2 RegExp.prototype

RegExp.prototype の初期値は RegExp プロトタイプオブジェクトである。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

22.2.5.3 get RegExp [ %Symbol.species% ]

RegExp[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、get アクセサは呼び出し時以下を行う:

  1. this 値を返す。

この関数の "name" プロパティ値は "get [Symbol.species]" である。

Note

RegExp プロトタイプメソッドは通常 this 値の constructor を用いて派生オブジェクトを生成する。サブクラスの constructor は %Symbol.species% プロパティを再定義することで既定挙動を上書きできる。

22.2.6 RegExp プロトタイプオブジェクトのプロパティ

RegExp プロトタイプオブジェクト:

  • %RegExp.prototype% である。
  • 通常のオブジェクトである。
  • RegExp インスタンスではなく [[RegExpMatcher]] 内部スロットや他の RegExp インスタンス内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
Note

RegExp プロトタイプオブジェクトは自身の "valueOf" プロパティを持たないが、Object プロトタイプオブジェクトから継承する。

22.2.6.1 RegExp.prototype.constructor

RegExp.prototype.constructor の初期値は %RegExp% である。

22.2.6.2 RegExp.prototype.exec ( string )

このメソッドは string 内で正規表現パターンの出現を検索し、マッチ結果を含む Array を返す。マッチしなければ null を返す。

呼び出し時に以下を行う:

  1. Rthis 値とする。
  2. RequireInternalSlot(R, [[RegExpMatcher]]) を実行する。
  3. S を ? ToString(string) とする。
  4. RegExpBuiltinExec(R, S) を返す。

22.2.6.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAll は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値とする。
  2. cu をコードユニット 0x0073 (LATIN SMALL LETTER S) とする。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.4 get RegExp.prototype.flags

RegExp.prototype.flags は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値とする。
  2. R がオブジェクトでなければ TypeError 例外を投げる。
  3. codeUnits を空 List とする。
  4. hasIndicesToBoolean(? Get(R, "hasIndices")) とする。
  5. hasIndicestrue ならコードユニット 0x0064 (LATIN SMALL LETTER D) を codeUnits に追加。
  6. globalToBoolean(? Get(R, "global")) とする。
  7. globaltrue なら 0x0067 (LATIN SMALL LETTER G) を追加。
  8. ignoreCaseToBoolean(? Get(R, "ignoreCase")) とする。
  9. ignoreCasetrue なら 0x0069 (LATIN SMALL LETTER I) を追加。
  10. multilineToBoolean(? Get(R, "multiline")) とする。
  11. multilinetrue なら 0x006D (LATIN SMALL LETTER M) を追加。
  12. dotAllToBoolean(? Get(R, "dotAll")) とする。
  13. dotAlltrue なら 0x0073 (LATIN SMALL LETTER S) を追加。
  14. unicodeToBoolean(? Get(R, "unicode")) とする。
  15. unicodetrue なら 0x0075 (LATIN SMALL LETTER U) を追加。
  16. unicodeSetsToBoolean(? Get(R, "unicodeSets")) とする。
  17. unicodeSetstrue なら 0x0076 (LATIN SMALL LETTER V) を追加。
  18. stickyToBoolean(? Get(R, "sticky")) とする。
  19. stickytrue なら 0x0079 (LATIN SMALL LETTER Y) を追加。
  20. codeUnits の要素をコードユニットとする String 値を返す。要素が無ければ空文字列を返す。

22.2.6.4.1 RegExpHasFlag ( R, codeUnit )

The abstract operation RegExpHasFlag takes arguments R (ECMAScript 言語値) and codeUnit (コードユニット) and returns Boolean または undefined を含む通常完了または throw 完了. It performs the following steps when called:

  1. R がオブジェクトでなければ TypeError 例外。
  2. R[[OriginalFlags]] 内部スロットを持たないなら
    1. SameValue(R, %RegExp.prototype%) が true なら undefined を返す。
    2. そうでなければ TypeError 例外。
  3. flagsR.[[OriginalFlags]] とする。
  4. flagscodeUnit を含むなら true を返す。
  5. false を返す。

22.2.6.5 get RegExp.prototype.global

RegExp.prototype.global は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0067 (LATIN SMALL LETTER G)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.6 get RegExp.prototype.hasIndices

RegExp.prototype.hasIndices は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0064 (LATIN SMALL LETTER D)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.7 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCase は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0069 (LATIN SMALL LETTER I)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値とする。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. flags を ? ToString(? Get(rx, "flags" )) とする。
  5. flags"g" を含まなければ
    1. RegExpExec(rx, S) を返す。
  6. そうでなければ
    1. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false とする。
    2. Set(rx, "lastIndex", +0𝔽, true) を実行する。
    3. A を ! ArrayCreate(0) とする。
    4. n を 0 とする。
    5. 繰り返し、
      1. result を ? RegExpExec(rx, S) とする。
      2. resultnull なら
        1. n = 0 なら null を返す。
        2. A を返す。
      3. そうでなければ
        1. matchStr を ? ToString(? Get(result, "0" )) とする。
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), matchStr) を実行。
        3. matchStr が空文字列なら
          1. thisIndex(? ToLength(? Get(rx, "lastIndex"))) とする。
          2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
          3. Set(rx, "lastIndex", 𝔽(nextIndex), true) を実行。
        4. nn + 1 にする。

このメソッドの "name" プロパティ値は "[Symbol.match]" である。

Note

%Symbol.match% プロパティは IsRegExp 抽象操作が正規表現基本挙動を持つオブジェクトを識別するのに用いられる。%Symbol.match% が存在しないか、その値が真へ強制されない場合、そのオブジェクトは正規表現オブジェクトとして意図されない。

22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. Rthis 値とする。
  2. R がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. C を ? SpeciesConstructor(R, %RegExp%) とする。
  5. flags を ? ToString(? Get(R, "flags" )) とする。
  6. matcher を ? Construct(C, « R, flags ») とする。
  7. lastIndex を ? ToLength(? Get(R, "lastIndex" )) とする。
  8. Set(matcher, "lastIndex", lastIndex, true) を実行。
  9. flags"g" を含むなら globaltrue、そうでなければ false
  10. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
  11. CreateRegExpStringIterator(matcher, S, global, fullUnicode) を返す。

このメソッドの "name" プロパティ値は "[Symbol.matchAll]" である。

22.2.6.10 get RegExp.prototype.multiline

RegExp.prototype.multiline は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x006D (LATIN SMALL LETTER M)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string, replaceValue )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値とする。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. lengthSS の長さとする。
  5. functionalReplaceIsCallable(replaceValue) とする。
  6. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue) とする。
  7. flags を ? ToString(? Get(rx, "flags" )) とする。
  8. flags"g" を含むなら globaltrue、そうでなければ false
  9. globaltrue なら
    1. Set(rx, "lastIndex", +0𝔽, true) を実行。
  10. results を空 List とする。
  11. donefalse とする。
  12. donefalse の間繰り返し、
    1. result を ? RegExpExec(rx, S) とする。
    2. resultnull なら
      1. donetrue にする。
    3. そうでなければ
      1. resultresults に追加。
      2. globalfalse なら
        1. donetrue にする。
      3. そうでなければ
        1. matchStr を ? ToString(? Get(result, "0" )) とする。
        2. matchStr が空文字列なら
          1. thisIndex(? ToLength(? Get(rx, "lastIndex"))) とする。
          2. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
          3. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
          4. Set(rx, "lastIndex", 𝔽(nextIndex), true) を実行。
  13. accumulatedResult を空文字列。
  14. nextSourcePosition を 0。
  15. resultresults について
    1. resultLength を ? LengthOfArrayLike(result)。
    2. nCapturesmax(resultLength - 1, 0)。
    3. matched を ? ToString(? Get(result, "0" ))。
    4. matchLengthmatched の長さ。
    5. position を ? ToIntegerOrInfinity(? Get(result, "index" ))。
    6. position を 0 と lengthS の間にクランプ。
    7. captures を新しい空 List
    8. n を 1。
    9. nnCaptures の間繰り返し、
      1. capN を ? Get(result, ! ToString(𝔽(n)))。
      2. capNundefined でなければ
        1. capN を ? ToString(capN)。
      3. capNcaptures に追加。
      4. 注記: n = 1 のとき最初のキャプチャが captures[0] に入る。一般に n 番目のキャプチャは captures[n - 1]。
      5. nn + 1。
    10. namedCaptures を ? Get(result, "groups")。
    11. functionalReplacetrue なら
      1. replacerArgs を « matched » と captures と « 𝔽(position), S » のリスト連結とする。
      2. namedCapturesundefined でなければ
        1. replacerArgsnamedCaptures を追加。
      3. replacementValue を ? Call(replaceValue, undefined, replacerArgs)。
      4. replacementString を ? ToString(replacementValue)。
    12. そうでなければ
      1. namedCapturesundefined でなければ
        1. namedCaptures を ? ToObject(namedCaptures)。
      2. replacementString を ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue)。
    13. positionnextSourcePosition なら
      1. 注記: position が後退するのは通常想定外であり、不正な RegExp サブクラス動作や副作用でフラグ等を変更した兆候である。その場合対応置換は無視される。
      2. accumulatedResultaccumulatedResultSnextSourcePosition から position まで、および replacementString の連結にする。
      3. nextSourcePositionposition + matchLength にする。
  16. nextSourcePositionlengthS なら accumulatedResult を返す。
  17. accumulatedResultSnextSourcePosition から末尾までの部分文字列の連結を返す。

このメソッドの "name" プロパティ値は "[Symbol.replace]" である。

22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string)。
  4. previousLastIndex を ? Get(rx, "lastIndex" )。
  5. previousLastIndex+0𝔽 でなければ
    1. Set(rx, "lastIndex", +0𝔽, true) を実行。
  6. result を ? RegExpExec(rx, S)。
  7. currentLastIndex を ? Get(rx, "lastIndex" )。
  8. SameValue(currentLastIndex, previousLastIndex) が false なら
    1. Set(rx, "lastIndex", previousLastIndex, true) を実行。
  9. resultnull なら -1𝔽 を返す。
  10. Get(result, "index") を返す。

このメソッドの "name" プロパティ値は "[Symbol.search]" である。

Note

検索時この RegExp オブジェクトの "lastIndex""global" プロパティは無視される。"lastIndex" は変更されない。

22.2.6.13 get RegExp.prototype.source

RegExp.prototype.source は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. R[[OriginalSource]] 内部スロットを持たないなら
    1. SameValue(R, %RegExp.prototype%) が true なら "(?:)" を返す。
    2. そうでなければ TypeError 例外。
  4. アサート: R[[OriginalFlags]] 内部スロットを持つ。
  5. srcR.[[OriginalSource]]
  6. flagsR.[[OriginalFlags]]
  7. EscapeRegExpPattern(src, flags) を返す。

22.2.6.13.1 EscapeRegExpPattern ( P, F )

The abstract operation EscapeRegExpPattern takes arguments P (String) and F (String) and returns String. It performs the following steps when called:

  1. F"v" を含むなら
    1. patternSymbolPattern[+UnicodeMode, +UnicodeSetsMode] とする。
  2. そうでなく F"u" を含むなら
    1. patternSymbolPattern[+UnicodeMode, ~UnicodeSetsMode] とする。
  3. それ以外
    1. patternSymbolPattern[~UnicodeMode, ~UnicodeSetsMode] とする。
  4. S を、特定コードポイントが下記のようにエスケープされた、P (UTF-16 エンコードされた Unicode コードポイントと解釈) に等価な patternSymbol 形式の String とする。SP と同一である場合と異なる場合があるが、SpatternSymbol として評価して得られる抽象クロージャは生成オブジェクトの [[RegExpMatcher]] 内部スロットの抽象クロージャと同一に振る舞わなければならない。同じ P, F での複数回呼び出しは同一結果を生成しなければならない。
  5. パターンに現れる / または任意の LineTerminator コードポイントは、"/", S, "/", F の連結が (適切な字句文脈で) 同一に振る舞う RegularExpressionLiteral としてパース可能となるよう S 内で必要に応じエスケープされる。例: P"/" の場合 S"\/""\u002F" 等が許されるが "/" は不可 ( /// + FSingleLineComment と解釈されるため )。 P が空文字列なら S"(?:)" として要件を満たせる。
  6. S を返す。
Note

名前が類似していても RegExp.escape と EscapeRegExpPattern は異なる。前者は文字列をパターン内部表現用にエスケープし、後者はパターンを文字列表現用にエスケープする。

22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string, limit )

Note 1

このメソッドは string を String に変換した結果の部分文字列を格納した配列を返す。部分文字列this 値である正規表現のマッチを左から右に探索して決定され、マッチ位置自体は結果配列要素には含まれず文字列を区切る役割をする。

this 値は空の正規表現、または空文字列にマッチする正規表現であり得る。その場合、入力文字列の先頭・末尾、前の区切りマッチ末尾における空 substring にはマッチしない。(例: 正規表現が空文字列にマッチするなら文字列は各コードユニット要素に分割され、結果配列長は文字列長に等しく、各 substring は 1 コードユニット。)あるインデックスで考慮されるマッチは最初の一つのみで、バックトラッキングにより非空マッチが得られても再考しない。(例: /a*?/[Symbol.split]("ab")["a","b"]/a*/[Symbol.split]("ab")["","b"]。)

string が(または変換後)空文字列の場合、正規表現が空文字列にマッチ可能かどうかで結果が異なる。マッチ可能なら結果配列は空、そうでなければ空文字列 1 要素を含む。

正規表現が捕捉括弧を含むとき、separator がマッチする毎にその結果(undefined を含む)が出力配列に挿入される。例:

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

は配列

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

を生成する。

limitundefined でなければ、出力配列は limit 要素を超えないよう切り詰められる。

このメソッドは呼び出し時以下を行う:

  1. rxthis 値。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string)。
  4. C を ? SpeciesConstructor(rx, %RegExp%)。
  5. flags を ? ToString(? Get(rx, "flags" ))。
  6. flags"u" または "v" を含むなら unicodeMatchingtrue、そうでなければ false
  7. flags"y" を含むなら newFlagsflags、そうでなければ newFlagsflags"y" の連結とする。
  8. splitter を ? Construct(C, « rx, newFlags »)。
  9. A を ! ArrayCreate(0)。
  10. lengthA を 0。
  11. limitundefined なら lim を 232 - 1、そうでなければ (? ToUint32(limit))。
  12. lim = 0 なら A を返す。
  13. S が空文字列なら
    1. z を ? RegExpExec(splitter, S)。
    2. znull でなければ A を返す。
    3. CreateDataPropertyOrThrow(A, "0", S)。
    4. A を返す。
  14. sizeS の長さ。
  15. p を 0。
  16. qp
  17. q < size の間繰り返し、
    1. Set(splitter, "lastIndex", 𝔽(q), true)。
    2. z を ? RegExpExec(splitter, S)。
    3. znull なら
      1. qAdvanceStringIndex(S, q, unicodeMatching) とする。
    4. そうでなければ
      1. e(? ToLength(? Get(splitter, "lastIndex")))。
      2. emin(e, size)。
      3. e = p なら
        1. qAdvanceStringIndex(S, q, unicodeMatching)。
      4. そうでなければ
        1. TSp から q部分文字列
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)。
        3. lengthAlengthA + 1。
        4. lengthA = lim なら A を返す。
        5. pe
        6. numberOfCaptures を ? LengthOfArrayLike(z)。
        7. numberOfCapturesmax(numberOfCaptures - 1, 0)。
        8. i を 1。
        9. inumberOfCaptures の間繰り返し、
          1. nextCapture を ? Get(z, ! ToString(𝔽(i)))。
          2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), nextCapture)。
          3. ii + 1。
          4. lengthAlengthA + 1。
          5. lengthA = lim なら A を返す。
        10. qp に設定。
  18. TSp から size部分文字列
  19. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)。
  20. A を返す。

このメソッドの "name" プロパティ値は "[Symbol.split]" である。

Note 2

このメソッドは RegExp オブジェクトの "global" および "sticky" プロパティ値を無視する。

22.2.6.15 get RegExp.prototype.sticky

RegExp.prototype.sticky は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0079 (LATIN SMALL LETTER Y)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.16 RegExp.prototype.test ( S )

このメソッドは呼び出し時以下を行う:

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. string を ? ToString(S)。
  4. match を ? RegExpExec(R, string)。
  5. matchnull でなければ true、そうでなければ false を返す。

22.2.6.17 RegExp.prototype.toString ( )

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. pattern を ? ToString(? Get(R, "source" ))。
  4. flags を ? ToString(? Get(R, "flags" ))。
  5. result"/", pattern, "/", flags の連結とする。
  6. result を返す。
Note

返される String は RegularExpressionLiteral の形式であり、同じ挙動の別 RegExp オブジェクトを評価する。

22.2.6.18 get RegExp.prototype.unicode

RegExp.prototype.unicode は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0075 (LATIN SMALL LETTER U)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.19 get RegExp.prototype.unicodeSets

RegExp.prototype.unicodeSets は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0076 (LATIN SMALL LETTER V)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.7 RegExp マッチングのための抽象操作

22.2.7.1 RegExpExec ( R, S )

The abstract operation RegExpExec takes arguments R (オブジェクト) and S (String) and returns オブジェクトまたは null を含む通常完了、または throw 完了. It performs the following steps when called:

  1. exec を ? Get(R, "exec") とする。
  2. IsCallable(exec) が true なら
    1. result を ? Call(exec, R, « S ») とする。
    2. result がオブジェクトでも null でもなければ TypeError 例外。
    3. result を返す。
  3. RequireInternalSlot(R, [[RegExpMatcher]]) を実行。
  4. RegExpBuiltinExec(R, S) を返す。
Note

呼び出し可能な "exec" プロパティが見つからない場合、このアルゴリズムは組み込み正規表現マッチングアルゴリズムにフォールバックする。これは過去版でほとんどの組み込みアルゴリズムが "exec" の動的プロパティ参照を行わなかったコードとの互換性を提供する。

22.2.7.2 RegExpBuiltinExec ( R, S )

The abstract operation RegExpBuiltinExec takes arguments R (初期化済み RegExp インスタンス) and S (String) and returns Array エキゾチックオブジェクトまたは null を含む通常完了、または throw 完了. It performs the following steps when called:

  1. lengthS の長さ。
  2. lastIndex(? ToLength(! Get(R, "lastIndex" )))。
  3. flagsR.[[OriginalFlags]]
  4. flags"g" を含むなら globaltrue、そうでなければ false
  5. flags"y" を含むなら stickytrue、そうでなければ false
  6. flags"d" を含むなら hasIndicestrue、そうでなければ false
  7. globalfalse かつ stickyfalse なら lastIndex を 0 に設定。
  8. matcherR.[[RegExpMatcher]]
  9. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
  10. matchSucceededfalse
  11. fullUnicodetrue なら input を StringToCodePoints(S)、そうでなければ inputS のコードユニット列 List とする。
  12. 注記: input の各要素は文字と見なす。
  13. matchSucceededfalse の間繰り返し、
    1. lastIndex > length なら
      1. global または stickytrue なら
        1. Set(R, "lastIndex", +0𝔽, true) を実行。
      2. null を返す。
    2. inputIndexSlastIndex 番目要素から得た文字の input 内インデックスとする。
    3. rmatcher(input, inputIndex) とする。
    4. rfailure なら
      1. stickytrue なら
        1. Set(R, "lastIndex", +0𝔽, true)。
        2. null を返す。
      2. lastIndexAdvanceStringIndex(S, lastIndex, fullUnicode) に設定。
    5. そうでなければ
      1. アサート: rMatchState
      2. matchSucceededtrue にする。
  14. er.[[EndIndex]]
  15. fullUnicodetrue なら eGetStringIndex(S, e) に設定。
  16. global または stickytrue なら
    1. Set(R, "lastIndex", 𝔽(e), true)。
  17. nr.[[Captures]] の要素数。
  18. アサート: n = R.[[RegExpRecord]].[[CapturingGroupsCount]]
  19. アサート: n < 232 - 1。
  20. A を ! ArrayCreate(n + 1)。
  21. アサート: A."length" の数学的値は n + 1。
  22. CreateDataPropertyOrThrow(A, "index", 𝔽(lastIndex))。
  23. CreateDataPropertyOrThrow(A, "input", S)。
  24. matchMatch Record { [[StartIndex]]: lastIndex, [[EndIndex]]: e }。
  25. indices を空 List
  26. groupNames を空 List
  27. indicesmatch を追加。
  28. matchedSubstrGetMatchString(S, match)。
  29. CreateDataPropertyOrThrow(A, "0", matchedSubstr)。
  30. RGroupName を含むなら
    1. groupsOrdinaryObjectCreate(null)。
    2. hasGroupstrue
  31. そうでなければ
    1. groupsundefined
    2. hasGroupsfalse
  32. CreateDataPropertyOrThrow(A, "groups", groups)。
  33. matchedGroupNames を空 List
  34. 1 ≤ in を昇順で各 i について
    1. captureIr.[[Captures]]i 番目要素。
    2. captureIundefined なら
      1. capturedValueundefined
      2. indicesundefined を追加。
    3. そうでなければ
      1. captureStartcaptureI.[[StartIndex]]
      2. captureEndcaptureI.[[EndIndex]]
      3. fullUnicodetrue なら
        1. captureStartGetStringIndex(S, captureStart)。
        2. captureEndGetStringIndex(S, captureEnd)。
      4. captureMatch Record { [[StartIndex]]: captureStart, [[EndIndex]]: captureEnd }。
      5. capturedValueGetMatchString(S, capture)。
      6. indicescapture を追加。
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), capturedValue)。
    5. i 番目のキャプチャが GroupName で定義されているなら
      1. s をその GroupName の CapturingGroupName とする。
      2. matchedGroupNamess を含むなら
        1. アサート: capturedValueundefined
        2. groupNamesundefined を追加。
      3. そうでなければ
        1. capturedValueundefined でなければ smatchedGroupNames に追加。
        2. 注記: 同名グループが複数ある場合 groups に既に s プロパティが存在することがあるが、すべて可書きデータプロパティなので CreateDataPropertyOrThrow は成功する。
        3. CreateDataPropertyOrThrow(groups, s, capturedValue)。
        4. groupNamess を追加。
    6. そうでなければ
      1. groupNamesundefined を追加。
  35. hasIndicestrue なら
    1. indicesArrayMakeMatchIndicesIndexPairArray(S, indices, groupNames, hasGroups) とする。
    2. CreateDataPropertyOrThrow(A, "indices", indicesArray)。
  36. A を返す。

22.2.7.3 AdvanceStringIndex ( S, index, unicode )

The abstract operation AdvanceStringIndex takes arguments S (String), index (非負整数), and unicode (Boolean) and returns 整数. It performs the following steps when called:

  1. アサート: index ≤ 253 - 1。
  2. unicodefalse なら index + 1 を返す。
  3. lengthS の長さ。
  4. index + 1 ≥ length なら index + 1 を返す。
  5. cp を CodePointAt(S, index)。
  6. index + cp.[[CodeUnitCount]] を返す。

22.2.7.4 GetStringIndex ( S, codePointIndex )

The abstract operation GetStringIndex takes arguments S (String) and codePointIndex (非負整数) and returns 非負整数. S を UTF-16 エンコードされたコードポイント列として解釈し (6.1.4)、codePointIndex に対応するコードユニットインデックスが存在すればそれを返し、存在しなければ S の長さを返す。 It performs the following steps when called:

  1. S が空文字列なら 0 を返す。
  2. lenS の長さ。
  3. codeUnitCount を 0。
  4. codePointCount を 0。
  5. codeUnitCount < len の間繰り返し、
    1. codePointCount = codePointIndex なら codeUnitCount を返す。
    2. cp を CodePointAt(S, codeUnitCount)。
    3. codeUnitCountcodeUnitCount + cp.[[CodeUnitCount]] に。
    4. codePointCountcodePointCount + 1 に。
  6. len を返す。

22.2.7.5 Match レコード

Match Record は正規表現のマッチまたはキャプチャの開始・終了インデックスを保持する Record 値である。

Match Record は Table 70 に列挙するフィールドを持つ。

Table 70: Match Record Fields
Field Name Value Meaning
[[StartIndex]] 非負整数 マッチ開始位置 (含む) までのコードユニット数。
[[EndIndex]] [[StartIndex]] 以上の整数 マッチ終了位置 (含まない) までのコードユニット数。

22.2.7.6 GetMatchString ( S, match )

The abstract operation GetMatchString takes arguments S (String) and match (Match Record) and returns String. It performs the following steps when called:

  1. アサート: match.[[StartIndex]]match.[[EndIndex]]S の長さ。
  2. Smatch.[[StartIndex]] から match.[[EndIndex]] までの部分文字列を返す。

22.2.7.7 GetMatchIndexPair ( S, match )

The abstract operation GetMatchIndexPair takes arguments S (String) and match (Match Record) and returns Array. It performs the following steps when called:

  1. アサート: match.[[StartIndex]]match.[[EndIndex]]S の長さ。
  2. CreateArrayFromList𝔽(match.[[StartIndex]]), 𝔽(match.[[EndIndex]]) ») を返す。

22.2.7.8 MakeMatchIndicesIndexPairArray ( S, indices, groupNames, hasGroups )

The abstract operation MakeMatchIndicesIndexPairArray takes arguments S (String), indices (Match Record または undefinedList), groupNames (String または undefinedList), and hasGroups (Boolean) and returns Array. It performs the following steps when called:

  1. nindices の要素数。
  2. アサート: n < 232 - 1。
  3. アサート: groupNamesn - 1 要素を持つ。
  4. 注記: groupNames の要素は indices[1] から整列。
  5. A を ! ArrayCreate(n)。
  6. hasGroupstrue なら
    1. groupsOrdinaryObjectCreate(null)。
  7. そうでなければ
    1. groupsundefined
  8. CreateDataPropertyOrThrow(A, "groups", groups)。
  9. 0 ≤ i < n を昇順で各 i について
    1. matchIndicesindices[i]。
    2. matchIndicesundefined でなければ
      1. matchIndexPairGetMatchIndexPair(S, matchIndices)。
    3. そうでなければ
      1. matchIndexPairundefined
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), matchIndexPair)。
    5. i > 0 なら
      1. sgroupNames[i - 1]。
      2. sundefined でなければ
        1. アサート: groupsundefined でない。
        2. 注記: 同名グループが複数ある場合でも groups通常オブジェクトなので再作成は成功する。
        3. CreateDataPropertyOrThrow(groups, s, matchIndexPair)。
  10. A を返す。

22.2.8 RegExp インスタンスのプロパティ

RegExp インスタンスは RegExp プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。RegExp インスタンスは内部スロット [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] を持つ。[[RegExpMatcher]] 内部スロットの値は RegExp オブジェクトの Pattern の抽象クロージャ表現である。

Note

ECMAScript 2015 以前は RegExp インスタンスは独自データプロパティ "source", "global", "ignoreCase", "multiline" を持つと規定されていた。これらは現在 RegExp.prototypeアクセサプロパティとして規定される。

RegExp インスタンスは次のプロパティも持つ:

22.2.8.1 lastIndex

"lastIndex" プロパティの値は次のマッチを開始する String インデックスを指定する。使用時に整数 Number へ強制される (22.2.7.2 参照)。属性は { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } とする。

22.2.9 RegExp 文字列イテレータオブジェクト

RegExp String Iterator は、特定の RegExp インスタンスオブジェクトに対して、特定の String インスタンスオブジェクト上の反復処理を表すオブジェクトである。RegExp String Iterator オブジェクトに対する名前付きコンストラクターは存在しない。代わりに、RegExp インスタンスオブジェクトの特定メソッド呼び出しによって生成される。

22.2.9.1 CreateRegExpStringIterator ( R, S, global, fullUnicode )

The abstract operation CreateRegExpStringIterator takes arguments R (オブジェクト), S (String), global (Boolean), and fullUnicode (Boolean) and returns オブジェクト. It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] ») とする。
  2. iterator.[[IteratingRegExp]]R を設定する。
  3. iterator.[[IteratedString]]S を設定する。
  4. iterator.[[Global]]global を設定する。
  5. iterator.[[Unicode]]fullUnicode を設定する。
  6. iterator.[[Done]]false を設定する。
  7. iterator を返す。

22.2.9.2 %RegExpStringIteratorPrototype% オブジェクト

%RegExpStringIteratorPrototype% オブジェクト:

  • 全ての RegExp String Iterator オブジェクトに継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )

  1. Othis 値とする。
  2. O がオブジェクトでなければ TypeError 例外を投げる。
  3. ORegExp String Iterator Object Instance の全内部スロット(22.2.9.3 参照)を持たなければ TypeError 例外を投げる。
  4. O.[[Done]]true なら
    1. CreateIteratorResultObject(undefined, true) を返す。
  5. RO.[[IteratingRegExp]] とする。
  6. SO.[[IteratedString]] とする。
  7. globalO.[[Global]] とする。
  8. fullUnicodeO.[[Unicode]] とする。
  9. match を ? RegExpExec(R, S) とする。
  10. matchnull なら
    1. O.[[Done]]true を設定する。
    2. CreateIteratorResultObject(undefined, true) を返す。
  11. globalfalse なら
    1. O.[[Done]]true を設定する。
    2. CreateIteratorResultObject(match, false) を返す。
  12. matchStr を ? ToString(? Get(match, "0" )) とする。
  13. matchStr が空文字列なら
    1. thisIndex(? ToLength(? Get(R, "lastIndex"))) とする。
    2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
    3. Set(R, "lastIndex", 𝔽(nextIndex), true) を実行する。
  14. CreateIteratorResultObject(match, false) を返す。

22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "RegExp String Iterator" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

22.2.9.3 RegExp String Iterator インスタンスのプロパティ

RegExp String Iterator インスタンスは %RegExpStringIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常オブジェクトである。RegExp String Iterator インスタンスは初期化時に Table 71 に列挙された内部スロットを持つ。

Table 71: RegExp String Iterator インスタンスの内部スロット
Internal Slot Type Description
[[IteratingRegExp]] an Object 反復に使用される正規表現。IsRegExp([[IteratingRegExp]]) は初期状態で true
[[IteratedString]] a String 反復対象となる String 値。
[[Global]] a Boolean [[IteratingRegExp]] が global かどうかを示す。
[[Unicode]] a Boolean [[IteratingRegExp]] が Unicode モードかどうかを示す。
[[Done]] a Boolean 反復処理が完了しているかどうかを示す。