페이지 표시 설정

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. string을 빈 String으로 둡니다.
  2. 그렇지 않으면,
    1. NewTarget이 undefined이고 value가 Symbol이면 SymbolDescriptiveString(value)을 반환합니다.
    2. string을 ? ToString(value)으로 둡니다.
  3. NewTarget이 undefined이면 string을 반환합니다.
  4. StringCreate(string, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%"))를 반환합니다.

22.1.2 String 생성자의 프로퍼티

String 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

22.1.2.1 String.fromCharCode ( ...codeUnits )

이 함수는 나머지 매개변수 codeUnits를 구성하는 임의의 수의 인수로 호출할 수 있습니다.

호출되면 다음 단계를 수행합니다:

  1. result를 빈 String으로 둡니다.
  2. codeUnits의 각 요소 next에 대해 다음을 수행합니다.
    1. nextCU를 숫자 값이 ℝ(? ToUint16(next))인 코드 단위로 둡니다.
    2. result를 result와 nextCU의 문자열 연결로 설정합니다.
  3. result를 반환합니다.

이 함수의 "length" 프로퍼티는 1𝔽입니다.

22.1.2.2 String.fromCodePoint ( ...codePoints )

이 함수는 나머지 매개변수 codePoints를 구성하는 임의의 수의 인수로 호출할 수 있습니다.

호출되면 다음 단계를 수행합니다:

  1. result를 빈 String으로 둡니다.
  2. codePoints의 각 요소 next에 대해 다음을 수행합니다.
    1. nextCP를 ? ToNumber(next)로 둡니다.
    2. nextCP가 정수 Number가 아니면 RangeError 예외를 던집니다.
    3. ℝ(nextCP) < 0 또는 ℝ(nextCP) > 0x10FFFF이면 RangeError 예외를 던집니다.
    4. result를 result와 UTF16EncodeCodePoint(ℝ(nextCP))의 문자열 연결로 설정합니다.
  3. 단언: codePoints가 비어 있으면 result는 빈 String입니다.
  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이며 나머지 인수는 List substitutions를 구성합니다.

호출되면 다음 단계를 수행합니다:

  1. substitutionCount를 substitutions의 요소 수로 둡니다.
  2. cooked를 ? ToObject(template)로 둡니다.
  3. literals를 ? ToObject(? Get(cooked, "raw"))로 둡니다.
  4. literalCount를 ? LengthOfArrayLike(literals)로 둡니다.
  5. literalCount ≤ 0이면 빈 String을 반환합니다.
  6. result를 빈 String으로 둡니다.
  7. nextIndex를 0으로 둡니다.
  8. 다음을 반복합니다.
    1. nextLiteralValue를 ? Get(literals, ! ToString(𝔽(nextIndex)))로 둡니다.
    2. nextLiteral을 ? ToString(nextLiteralValue)으로 둡니다.
    3. result를 result와 nextLiteral의 문자열 연결로 설정합니다.
    4. nextIndex + 1 = literalCount이면 result를 반환합니다.
    5. nextIndex < substitutionCount이면, 다음을 수행합니다.
      1. nextSubValue를 substitutions[nextIndex]로 둡니다.
      2. nextSub를 ? ToString(nextSubValue)로 둡니다.
      3. result를 result와 nextSub의 문자열 연결로 설정합니다.
    6. nextIndex를 nextIndex + 1로 설정합니다.
참고

이 함수는 Tagged Template(13.3.11)의 태그 함수로 사용하도록 의도되었습니다. 이러한 방식으로 호출되면 첫 번째 인수는 올바른 형식의 템플릿 객체이며 나머지 매개변수에는 치환 값이 포함됩니다.

22.1.3 String 프로토타입 객체의 프로퍼티

String 프로토타입 객체는:

  • %String.prototype%입니다.
  • String 특수 객체이며 이러한 객체에 지정된 내부 메서드를 갖습니다.
  • 값이 빈 String인 [[StringData]] 내부 슬롯을 갖습니다.
  • 초기 값이 +0𝔽이고 속성이 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }인 "length" 프로퍼티를 갖습니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.

명시적으로 달리 언급하지 않는 한 아래에 정의된 String 프로토타입 객체의 메서드는 일반적이지 않으며, 전달되는 this 값은 String 값 또는 String 값으로 초기화된 [[StringData]] 내부 슬롯을 갖는 객체여야 합니다.

22.1.3.1 String.prototype.at ( index )

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. length를 string의 길이로 둡니다.
  5. k를 ? ToAbsoluteIndex(index, length)로 둡니다.
  6. k < 0 또는 k ≥ length이면 undefined를 반환합니다.
  7. string의 k부터 k + 1까지의 부분 문자열을 반환합니다.

22.1.3.2 String.prototype.charAt ( position )

참고 1

이 메서드는 이 객체를 String으로 변환하여 얻은 String 값의 인덱스 position에 있는 코드 단위를 포함하는 단일 요소 String을 반환합니다. 해당 인덱스에 요소가 없으면 결과는 빈 String입니다. 결과는 String 객체가 아니라 String 값입니다.

pos가 정수 Number이면 x.charAt(pos)의 결과는 x.substring(pos, pos + 1)의 결과와 동등합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. position을 ? ToIntegerOrInfinity(position)으로 설정합니다.
  5. size를 string의 길이로 둡니다.
  6. position < 0 또는 position ≥ size이면 빈 String을 반환합니다.
  7. string의 position부터 position + 1까지의 부분 문자열을 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.3 String.prototype.charCodeAt ( position )

참고 1

이 메서드는 이 객체를 String으로 변환하여 얻은 String의 인덱스 position에 있는 코드 단위의 숫자 값인 Number(216보다 작은 음이 아닌 정수 Number)를 반환합니다. 해당 인덱스에 요소가 없으면 결과는 NaN입니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. position을 ? ToIntegerOrInfinity(position)으로 설정합니다.
  5. size를 string의 길이로 둡니다.
  6. position < 0 또는 position ≥ size이면 NaN을 반환합니다.
  7. String string 안의 인덱스 position에 있는 코드 단위의 숫자 값에 해당하는 Number 값을 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.4 String.prototype.codePointAt ( position )

참고 1

이 메서드는 이 객체를 String으로 변환하여 얻은 String의 인덱스 position에 있는 문자열 요소에서 시작하는 UTF-16 인코딩 코드 포인트(6.1.4)의 숫자 값인 0x10FFFF𝔽 이하의 음이 아닌 정수 Number를 반환합니다. 해당 인덱스에 요소가 없으면 결과는 undefined입니다. 유효한 UTF-16 서로게이트 쌍이 position에서 시작하지 않으면 결과는 position의 코드 단위입니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. position을 ? ToIntegerOrInfinity(position)으로 설정합니다.
  5. size를 string의 길이로 둡니다.
  6. position < 0 또는 position ≥ size이면 undefined를 반환합니다.
  7. codePoint를 CodePointAt(string, position)로 둡니다.
  8. 𝔽(codePoint.[[CodePoint]])를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

참고 1

이 메서드가 호출되면 this 값의 코드 단위(this 값을 String으로 변환한 것) 뒤에 각 인수를 String으로 변환한 코드 단위가 이어지는 String 값을 반환합니다. 결과는 String 객체가 아니라 String 값입니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. result를 string으로 둡니다.
  5. args의 각 요소 next에 대해 다음을 수행합니다.
    1. nextString을 ? ToString(next)으로 둡니다.
    2. result를 result와 nextString의 문자열 연결로 설정합니다.
  6. result를 반환합니다.

이 메서드의 "length" 프로퍼티는 1𝔽입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.6 String.prototype.constructor

String.prototype.constructor의 초기 값은 %String%입니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. isRegexp를 ? IsRegExp(searchString)로 둡니다.
  5. isRegexp가 true이면 TypeError 예외를 던집니다.
  6. searchString을 ? ToString(searchString)으로 설정합니다.
  7. length를 string의 길이로 둡니다.
  8. endPosition이 undefined이면 end를 length로 둡니다. 그렇지 않으면 end를 ? ToIntegerOrInfinity(endPosition)을 0과 length 사이로 제한한 결과로 둡니다.
  9. searchLength를 searchString의 길이로 둡니다.
  10. searchLength = 0이면 true를 반환합니다.
  11. start를 end - searchLength로 둡니다.
  12. start < 0이면 false를 반환합니다.
  13. substring을 string의 start부터 end까지의 부분 문자열로 둡니다.
  14. substring이 searchString이면 true를 반환합니다.
  15. false를 반환합니다.
참고 1

첫 번째 인수가 RegExp이면 예외를 던지도록 명시한 것은 향후 판에서 이러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. isRegexp를 ? IsRegExp(searchString)로 둡니다.
  5. isRegexp가 true이면 TypeError 예외를 던집니다.
  6. searchString을 ? ToString(searchString)으로 설정합니다.
  7. length를 string의 길이로 둡니다.
  8. start를 ? ToIntegerOrInfinity(position)을 0과 length 사이로 제한한 결과로 둡니다.
  9. 단언: position이 undefined이면 start는 0입니다.
  10. index를 StringIndexOf(string, searchString, start)로 둡니다.
  11. index가 not-found이면 false를 반환합니다.
  12. true를 반환합니다.
참고 1

searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서 position 이상인 하나 이상의 인덱스에 나타나면 이 함수는 true를 반환하고, 그렇지 않으면 false를 반환합니다. position이 undefined이면 전체 String을 검색하도록 0으로 간주합니다.

참고 2

첫 번째 인수가 RegExp이면 예외를 던지도록 명시한 것은 향후 판에서 이러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함입니다.

참고 3

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

참고 1

searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서 position 이상인 하나 이상의 인덱스에 나타나면 그러한 인덱스 중 가장 작은 값을 반환하고, 그렇지 않으면 -1𝔽을 반환합니다. position이 undefined이면 전체 String을 검색하도록 +0𝔽으로 간주합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. searchString을 ? ToString(searchString)으로 설정합니다.
  5. length를 string의 길이로 둡니다.
  6. start를 ? ToIntegerOrInfinity(position)을 0과 length 사이로 제한한 결과로 둡니다.
  7. 단언: position이 undefined이면 start는 0입니다.
  8. result를 StringIndexOf(string, searchString, start)로 둡니다.
  9. result가 not-found이면 -1𝔽을 반환합니다.
  10. 𝔽(result)를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.10 String.prototype.isWellFormed ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. IsStringWellFormedUnicode(string)를 반환합니다.

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

참고 1

searchString이 이 객체를 String으로 변환한 결과의 부분 문자열로서 position 이하인 하나 이상의 인덱스에 나타나면 그러한 인덱스 중 가장 큰 값을 반환하고, 그렇지 않으면 -1𝔽을 반환합니다. position이 undefined이면 전체 String을 검색하도록 String 값의 길이로 간주합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. searchString을 ? ToString(searchString)으로 설정합니다.
  5. numberPosition을 ? ToNumber(position)으로 둡니다.
  6. length를 string의 길이로 둡니다.
  7. searchLength를 searchString의 길이로 둡니다.
  8. maxStart를 length - searchLength로 둡니다.
  9. maxStart < 0이면 -1𝔽을 반환합니다.
  10. numberPosition이 NaN이면 start를 maxStart로 둡니다. 그렇지 않으면 start를 ! ToIntegerOrInfinity(numberPosition)을 0과 maxStart 사이로 제한한 결과로 둡니다.
  11. 단언: position이 undefined이면 start는 maxStart입니다.
  12. result를 StringLastIndexOf(string, searchString, start)로 둡니다.
  13. result가 not-found이면 -1𝔽을 반환합니다.
  14. 𝔽(result)를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 this 값(String string으로 변환됨)과 that(String thatValue로 변환됨)을 구현체 정의 로케일 민감 String 비교한 결과를 나타내는 NaN이 아닌 Number를 반환합니다. 결과는 호스트 환경의 현재 로케일 관례에 따른 String 값의 정렬 순서에 대응하도록 의도되며, string이 thatValue보다 앞에 정렬되면 음수, string이 thatValue보다 뒤에 정렬되면 양수, 그 밖의 모든 경우에는 0(string과 thatValue 사이에 상대적 순서가 없음을 나타냄)이 됩니다.

비교를 수행하기 전에 이 메서드는 String을 준비하기 위해 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. thatValue를 ? ToString(that)으로 둡니다.

이 메서드의 선택적 두 번째 및 세 번째 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치에 다른 해석을 부여해서는 안 됩니다.

추가 정보를 인코딩할 수 있도록 실제 반환 값은 구현체 정의이지만, 이 메서드를 두 인수의 메서드로 간주할 때 모든 String 집합에 대한 전순서를 정의하는 일관된 비교기여야 합니다. 또한 이 메서드는 유니코드 표준에 따른 정규 동등성을 인식하고 준수해야 하며, 구별 가능한 String이 정규적으로 동등한 경우 비교 시 +0𝔽을 반환하는 것도 포함됩니다.

참고 1

이 메서드 자체는 Array.prototype.sort의 인수로 직접 사용하기에는 적합하지 않습니다. 후자는 두 인수를 받는 함수를 필요로 하기 때문입니다.

참고 2

이 메서드는 호스트 환경이 ECMAScript 환경에 제공하는 언어 및/또는 로케일 민감 비교 기능을 사용할 수 있으며, 호스트 환경의 현재 로케일 관례에 따라 비교하도록 의도됩니다. 그러나 비교 기능과 관계없이 이 메서드는 유니코드 표준에 따른 정규 동등성을 인식하고 준수해야 합니다. 예를 들어 다음 비교는 모두 +0𝔽을 반환해야 합니다:

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

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

// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE와
// ṩ 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와
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE 비교
"\u1E0B\u0323".localeCompare("\u1E0D\u0307")

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

정규 동등성의 정의와 논의는 유니코드 표준 제2장 및 제3장과 Unicode Standard Annex #15, Unicode Normalization Forms 및 Unicode Technical Note #5, Canonical Equivalence in Applications를 참조하시기 바랍니다. 또한 Unicode Technical Standard #10, Unicode Collation Algorithm도 참조하시기 바랍니다.

이 메서드는 유니코드 표준 제3장 3.7절에 정의된 유니코드 호환 동등 또는 호환 분해를 준수하지 않는 것이 권장됩니다.

참고 3

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.13 String.prototype.match ( regexpOrPattern )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. regexpOrPattern이 Object이면, 다음을 수행합니다.
    1. matcher를 ? GetMethod(regexpOrPattern, %Symbol.match%)로 둡니다.
    2. matcher가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(matcher, regexpOrPattern, « thisValue »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. regexp를 ? RegExpCreate(regexpOrPattern, undefined)로 둡니다.
  6. ? Invoke(regexp, %Symbol.match%, « string »)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.14 String.prototype.matchAll ( regexpOrPattern )

이 메서드는 this 값을 나타내는 String과 regexpOrPattern 사이에서 정규 표현식 일치를 수행하고 일치 결과를 생성하는 반복자를 반환합니다. 각 일치 결과는 String에서 일치한 부분을 첫 번째 요소로 포함하고, 그 뒤에 캡처링 그룹이 일치한 부분이 이어지는 Array입니다. 정규 표현식이 한 번도 일치하지 않으면 반환된 반복자는 어떤 일치 결과도 생성하지 않습니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. regexpOrPattern이 Object이면, 다음을 수행합니다.
    1. isRegexp를 ? IsRegExp(regexpOrPattern)로 둡니다.
    2. isRegexp가 true이면, 다음을 수행합니다.
      1. flags를 ? Get(regexpOrPattern, "flags")로 둡니다.
      2. ? RequireObjectCoercible(flags)를 수행합니다.
      3. ? ToString(flags)에 "g"가 포함되어 있지 않으면 TypeError 예외를 던집니다.
    3. matcher를 ? GetMethod(regexpOrPattern, %Symbol.matchAll%)로 둡니다.
    4. matcher가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(matcher, regexpOrPattern, « thisValue »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. regexp를 ? RegExpCreate(regexpOrPattern, "g")로 둡니다.
  6. ? Invoke(regexp, %Symbol.matchAll%, « string »)를 반환합니다.
참고 1
이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.
참고 2
String.prototype.split과 마찬가지로 String.prototype.matchAll은 일반적으로 입력을 변경하지 않고 동작하도록 설계되었습니다.

22.1.3.15 String.prototype.normalize ( [ form ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. form이 undefined이면 form을 "NFC"로 설정합니다.
  5. 그렇지 않으면 form을 ? ToString(form)으로 설정합니다.
  6. form이 "NFC", "NFD", "NFKC" 또는 "NFKD" 중 하나가 아니면 RangeError 예외를 던집니다.
  7. normal을 최신 유니코드 표준의 정규화 형식에 명시된 대로 form이 이름을 지정하는 정규화 형식으로 string을 정규화한 결과인 String 값으로 둡니다.
  8. normal을 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. ? StringPaddingBuiltinsImpl(thisValue, maxLength, fillString, end)를 반환합니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. ? StringPaddingBuiltinsImpl(thisValue, maxLength, fillString, start)를 반환합니다.

22.1.3.17.1 StringPaddingBuiltinsImpl ( thisValue, maxLength, fillString, placement )

추상 연산 StringPaddingBuiltinsImpl. 인수 thisValue (ECMAScript 언어 값), maxLength (ECMAScript 언어 값), fillString (ECMAScript 언어 값) 및 placement ((start 또는 end)). 반환값: (정상 완료 (값: String) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. string을 ? ToString(thisValue)으로 둡니다.
  2. intMaxLength를 ℝ(? ToLength(maxLength))로 둡니다.
  3. stringLength를 string의 길이로 둡니다.
  4. intMaxLength ≤ stringLength이면 string을 반환합니다.
  5. fillString이 undefined이면 fillString을 코드 단위 0x0020 (SPACE)만으로 구성된 String 값으로 설정합니다.
  6. 그렇지 않으면 fillString을 ? ToString(fillString)으로 설정합니다.
  7. StringPad(string, intMaxLength, fillString, placement)를 반환합니다.

22.1.3.17.2 StringPad ( string, maxLength, fillString, placement )

추상 연산 StringPad. 인수 string (String), maxLength (음이 아닌 정수), fillString (String) 및 placement ((start 또는 end)). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. stringLength를 string의 길이로 둡니다.
  2. maxLength ≤ stringLength이면 string을 반환합니다.
  3. fillString이 빈 String이면 string을 반환합니다.
  4. fillLength를 maxLength - stringLength로 둡니다.
  5. truncatedStringFiller를 fillString의 반복된 연결을 길이 fillLength로 잘라 구성한 String 값으로 둡니다.
  6. placement가 start이면 truncatedStringFiller와 string의 문자열 연결을 반환합니다.
  7. string과 truncatedStringFiller의 문자열 연결을 반환합니다.
참고 1

인수 maxLength는 string의 길이보다 작아질 수 없도록 제한됩니다.

참고 2

인수 fillString의 기본값은 " " (코드 단위 0x0020 SPACE로 구성된 String 값)입니다.

22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )

추상 연산 ToZeroPaddedDecimalString. 인수 n (음이 아닌 정수) 및 minLength (음이 아닌 정수). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. string을 십진수로 형식화한 n의 String 표현으로 둡니다.
  2. StringPad(string, minLength, "0", start)를 반환합니다.

22.1.3.18 String.prototype.repeat ( count )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. n을 ? ToIntegerOrInfinity(count)로 둡니다.
  5. n < 0 또는 n = +∞이면 RangeError 예외를 던집니다.
  6. n = 0이면 빈 String을 반환합니다.
  7. string의 복사본 n개를 서로 이어 붙여 만든 String 값을 반환합니다.
참고 1

이 메서드는 this 값(String으로 변환됨)의 코드 단위를 count번 반복한 String 값을 생성합니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.19 String.prototype.replace ( searchValue, replaceValue )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. searchValue가 Object이면, 다음을 수행합니다.
    1. replacer를 ? GetMethod(searchValue, %Symbol.replace%)로 둡니다.
    2. replacer가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(replacer, searchValue, « thisValue, replaceValue »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. searchString을 ? ToString(searchValue)으로 둡니다.
  6. functionalReplace를 IsCallable(replaceValue)로 둡니다.
  7. functionalReplace가 false이면, 다음을 수행합니다.
    1. replaceValue를 ? ToString(replaceValue)으로 설정합니다.
  8. searchLength를 searchString의 길이로 둡니다.
  9. position을 StringIndexOf(string, searchString, 0)으로 둡니다.
  10. position이 not-found이면 string을 반환합니다.
  11. preceding을 string의 0부터 position까지의 부분 문자열로 둡니다.
  12. following을 string의 position + searchLength부터의 부분 문자열로 둡니다.
  13. functionalReplace가 true이면, 다음을 수행합니다.
    1. replacement를 ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(position), string »))으로 둡니다.
  14. 그렇지 않으면,
    1. 단언: replaceValue는 String입니다.
    2. captures를 새로운 빈 List로 둡니다.
    3. replacement를 ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue)로 둡니다.
  15. preceding, replacement 및 following의 문자열 연결을 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

추상 연산 GetSubstitution. 인수 matched (String), string (String), position (음이 아닌 정수), captures (리스트 (요소: (String 또는 undefined))), namedCaptures ((Object 또는 undefined)) 및 replacementTemplate (String). 반환값: (정상 완료 (값: String) 또는 throw 완료). 이 추상 연산의 목적상 십진 숫자는 0x0030 (DIGIT ZERO)부터 0x0039 (DIGIT NINE)까지의 폐구간에 속하는 코드 단위입니다. 호출되면 다음 단계를 수행한다.

  1. stringLength를 string의 길이로 둡니다.
  2. 단언: position ≤ stringLength입니다.
  3. result를 빈 String으로 둡니다.
  4. templateRemainder를 replacementTemplate로 둡니다.
  5. templateRemainder가 빈 String이 아닌 동안 다음을 반복합니다.
    1. 참고: 다음 단계는 ref(templateRemainder의 접두사)를 분리하고, refReplacement(그 치환 값)를 결정한 다음 해당 치환 값을 result에 추가합니다.
    2. templateRemainder가 "$$"로 시작하면, 다음을 수행합니다.
      1. ref를 "$$"로 둡니다.
      2. refReplacement를 "$"로 둡니다.
    3. 그렇지 않고 templateRemainder가 "$`"로 시작하면, 다음을 수행합니다.
      1. ref를 "$`"로 둡니다.
      2. refReplacement를 string의 0부터 position까지의 부분 문자열로 둡니다.
    4. 그렇지 않고 templateRemainder가 "$&"로 시작하면, 다음을 수행합니다.
      1. ref를 "$&"로 둡니다.
      2. refReplacement를 matched로 둡니다.
    5. 그렇지 않고 templateRemainder가 "$'" (0x0024 (DOLLAR SIGN) 뒤에 0x0027 (APOSTROPHE)이 이어짐)로 시작하면, 다음을 수행합니다.
      1. ref를 "$'"로 둡니다.
      2. matchLength를 matched의 길이로 둡니다.
      3. tailPosition을 position + matchLength로 둡니다.
      4. refReplacement를 string의 min(tailPosition, stringLength)부터의 부분 문자열로 둡니다.
      5. 참고: tailPosition이 stringLength를 초과할 수 있는 경우는 이 추상 연산이 "exec" 프로퍼티가 내재 %RegExp.prototype.exec%가 아닌 객체에 대해 %RegExp.prototype%의 내재 %Symbol.replace% 메서드를 호출하여 실행된 경우뿐입니다.
    6. 그렇지 않고 templateRemainder가 "$" 뒤에 하나 이상의 십진 숫자가 이어지는 형태로 시작하면, 다음을 수행합니다.
      1. templateRemainder가 "$" 뒤에 둘 이상의 십진 숫자가 이어지는 형태로 시작하면 digitCount를 2로 둡니다. 그렇지 않으면 digitCount를 1로 둡니다.
      2. digits를 templateRemainder의 1부터 1 + digitCount까지의 부분 문자열로 둡니다.
      3. index를 ℝ(StringToNumber(digits))로 둡니다.
      4. 단언: 0 ≤ index ≤ 99입니다.
      5. captureLength를 captures의 요소 수로 둡니다.
      6. index > captureLength이고 digitCount = 2이면, 다음을 수행합니다.
        1. 참고: 두 자리 치환 패턴이 캡처링 그룹 수를 초과하는 인덱스를 지정하면 한 자리 치환 패턴 뒤에 리터럴 숫자가 이어진 것으로 처리합니다.
        2. digitCount를 1로 설정합니다.
        3. digits를 digits의 0부터 1까지의 부분 문자열로 설정합니다.
        4. index를 ℝ(StringToNumber(digits))로 설정합니다.
      7. ref를 templateRemainder의 0부터 1 + digitCount까지의 부분 문자열로 둡니다.
      8. 1 ≤ index ≤ captureLength이면, 다음을 수행합니다.
        1. capture를 captures[index - 1]로 둡니다.
        2. capture가 undefined이면, 다음을 수행합니다.
          1. refReplacement를 빈 String으로 둡니다.
        3. 그렇지 않으면,
          1. refReplacement를 capture로 둡니다.
      9. 그렇지 않으면,
        1. refReplacement를 ref로 둡니다.
    7. 그렇지 않고 templateRemainder가 "$<"로 시작하면, 다음을 수행합니다.
      1. gtPosition을 StringIndexOf(templateRemainder, ">", 0)으로 둡니다.
      2. gtPosition이 not-found이거나 namedCaptures가 undefined이면, 다음을 수행합니다.
        1. ref를 "$<"로 둡니다.
        2. refReplacement를 ref로 둡니다.
      3. 그렇지 않으면,
        1. ref를 templateRemainder의 0부터 gtPosition + 1까지의 부분 문자열로 둡니다.
        2. groupName을 templateRemainder의 2부터 gtPosition까지의 부분 문자열로 둡니다.
        3. 단언: namedCaptures는 Object입니다.
        4. capture를 ? Get(namedCaptures, groupName)로 둡니다.
        5. capture가 undefined이면, 다음을 수행합니다.
          1. refReplacement를 빈 String으로 둡니다.
        6. 그렇지 않으면,
          1. refReplacement를 ? ToString(capture)으로 둡니다.
    8. 그렇지 않으면,
      1. ref를 templateRemainder의 0부터 1까지의 부분 문자열로 둡니다.
      2. refReplacement를 ref로 둡니다.
    9. refLength를 ref의 길이로 둡니다.
    10. templateRemainder를 templateRemainder의 refLength부터의 부분 문자열로 설정합니다.
    11. result를 result와 refReplacement의 문자열 연결로 설정합니다.
  6. result를 반환합니다.

22.1.3.20 String.prototype.replaceAll ( searchValue, replaceValue )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. searchValue가 Object이면, 다음을 수행합니다.
    1. isRegexp를 ? IsRegExp(searchValue)로 둡니다.
    2. isRegexp가 true이면, 다음을 수행합니다.
      1. flags를 ? Get(searchValue, "flags")로 둡니다.
      2. ? RequireObjectCoercible(flags)를 수행합니다.
      3. ? ToString(flags)에 "g"가 포함되어 있지 않으면 TypeError 예외를 던집니다.
    3. replacer를 ? GetMethod(searchValue, %Symbol.replace%)로 둡니다.
    4. replacer가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(replacer, searchValue, « thisValue, replaceValue »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. searchString을 ? ToString(searchValue)으로 둡니다.
  6. functionalReplace를 IsCallable(replaceValue)로 둡니다.
  7. functionalReplace가 false이면, 다음을 수행합니다.
    1. replaceValue를 ? ToString(replaceValue)으로 설정합니다.
  8. searchLength를 searchString의 길이로 둡니다.
  9. advanceBy를 max(1, searchLength)로 둡니다.
  10. matchPositions를 새로운 빈 List로 둡니다.
  11. position을 StringIndexOf(string, searchString, 0)으로 둡니다.
  12. position이 not-found가 아닌 동안 다음을 반복합니다.
    1. position을 matchPositions에 추가합니다.
    2. position을 StringIndexOf(string, searchString, position + advanceBy)로 설정합니다.
  13. endOfLastMatch를 0으로 둡니다.
  14. result를 빈 String으로 둡니다.
  15. matchPositions의 각 요소 matchPosition에 대해 다음을 수행합니다.
    1. preserved를 string의 endOfLastMatch부터 matchPosition까지의 부분 문자열로 둡니다.
    2. functionalReplace가 true이면, 다음을 수행합니다.
      1. replacement를 ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(matchPosition), string »))으로 둡니다.
    3. 그렇지 않으면,
      1. 단언: replaceValue는 String입니다.
      2. captures를 새로운 빈 List로 둡니다.
      3. replacement를 ! GetSubstitution(searchString, string, matchPosition, captures, undefined, replaceValue)로 둡니다.
    4. result를 result, preserved 및 replacement의 문자열 연결로 설정합니다.
    5. endOfLastMatch를 matchPosition + searchLength로 설정합니다.
  16. endOfLastMatch < string의 길이이면, 다음을 수행합니다.
    1. result를 result와 string의 endOfLastMatch부터의 부분 문자열의 문자열 연결로 설정합니다.
  17. result를 반환합니다.

22.1.3.21 String.prototype.search ( regexpOrPattern )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. regexpOrPattern이 Object이면, 다음을 수행합니다.
    1. searcher를 ? GetMethod(regexpOrPattern, %Symbol.search%)로 둡니다.
    2. searcher가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(searcher, regexpOrPattern, « thisValue »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. regexp를 ? RegExpCreate(regexpOrPattern, undefined)로 둡니다.
  6. ? Invoke(regexp, %Symbol.search%, « string »)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.22 String.prototype.slice ( start, end )

이 메서드는 이 객체를 String으로 변환한 결과의 인덱스 start에서 시작하여 인덱스 end 직전까지 이어지는 부분 문자열(end가 undefined이면 String의 끝까지)을 반환합니다. start가 음수이면 String의 길이인 sourceLength에 대해 sourceLength + start로 처리합니다. end가 음수이면 sourceLength + end로 처리합니다. 결과는 String 객체가 아니라 String 값입니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. length를 string의 길이로 둡니다.
  5. from을 ? ToClampedIndex(start, length)로 둡니다.
  6. end가 undefined이면 to를 length로 둡니다. 그렇지 않으면 to를 ? ToClampedIndex(end, length)로 둡니다.
  7. from ≥ to이면 빈 String을 반환합니다.
  8. string의 from부터 to까지의 부분 문자열을 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.23 String.prototype.split ( separator, limit )

이 메서드는 이 객체를 String으로 변환한 결과의 부분 문자열을 저장한 Array를 반환합니다. 부분 문자열은 왼쪽에서 오른쪽으로 separator의 출현을 검색하여 결정합니다. 이러한 출현은 반환되는 배열 안의 어떤 String에도 포함되지 않고 String 값을 나누는 역할을 합니다. separator 값은 임의 길이의 String일 수도 있고 %Symbol.split% 메서드를 갖는 RegExp와 같은 객체일 수도 있습니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. separator가 Object이면, 다음을 수행합니다.
    1. splitter를 ? GetMethod(separator, %Symbol.split%)로 둡니다.
    2. splitter가 undefined가 아니면, 다음을 수행합니다.
      1. ? Call(splitter, separator, « thisValue, limit »)를 반환합니다.
  4. string을 ? ToString(thisValue)으로 둡니다.
  5. limit가 undefined이면 lim을 232 - 1로 둡니다. 그렇지 않으면 lim을 ℝ(? ToUint32(limit))로 둡니다.
  6. separatorString을 ? ToString(separator)로 둡니다.
  7. lim = 0이면, 다음을 수행합니다.
    1. CreateArrayFromList(« »)를 반환합니다.
  8. separator가 undefined이면, 다음을 수행합니다.
    1. CreateArrayFromList(« string »)를 반환합니다.
  9. separatorLength를 separatorString의 길이로 둡니다.
  10. separatorLength = 0이면, 다음을 수행합니다.
    1. stringLength를 string의 길이로 둡니다.
    2. outLength를 lim을 0과 stringLength 사이로 제한한 결과로 둡니다.
    3. head를 string의 0부터 outLength까지의 부분 문자열로 둡니다.
    4. codeUnits를 head의 요소인 코드 단위 시퀀스로 구성된 List로 둡니다.
    5. CreateArrayFromList(codeUnits)를 반환합니다.
  11. string이 빈 String이면 CreateArrayFromList(« string »)를 반환합니다.
  12. substrings를 새로운 빈 List로 둡니다.
  13. searchStart를 0으로 둡니다.
  14. matchIndex를 StringIndexOf(string, separatorString, 0)으로 둡니다.
  15. matchIndex가 not-found가 아닌 동안 다음을 반복합니다.
    1. substring을 string의 searchStart부터 matchIndex까지의 부분 문자열로 둡니다.
    2. substring을 substrings에 추가합니다.
    3. substrings의 요소 수가 lim이면 CreateArrayFromList(substrings)를 반환합니다.
    4. searchStart를 matchIndex + separatorLength로 설정합니다.
    5. matchIndex를 StringIndexOf(string, separatorString, searchStart)로 설정합니다.
  16. substring을 string의 searchStart부터의 부분 문자열로 둡니다.
  17. substring을 substrings에 추가합니다.
  18. CreateArrayFromList(substrings)를 반환합니다.
참고 1

separator 값은 빈 String일 수 있습니다. 이 경우 separator는 입력 String의 시작이나 끝에 있는 빈 부분 문자열과 일치하지 않으며, 이전 구분자 일치의 끝에 있는 빈 부분 문자열과도 일치하지 않습니다. separator가 빈 String이면 String은 개별 코드 단위 요소로 분할됩니다. 결과 배열의 길이는 String의 길이와 같고 각 부분 문자열에는 하나의 코드 단위가 포함됩니다.

this 값이 빈 String이거나 빈 String으로 변환되는 경우 결과는 separator가 빈 String과 일치할 수 있는지에 따라 달라집니다. 일치할 수 있으면 결과 배열에는 요소가 없습니다. 그렇지 않으면 결과 배열에는 빈 String인 하나의 요소가 있습니다.

separator가 undefined이면 결과 배열에는 this 값(String으로 변환됨)인 하나의 String만 포함됩니다. limit가 undefined가 아니면 출력 배열은 limit개보다 많은 요소를 포함하지 않도록 잘립니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. isRegexp를 ? IsRegExp(searchString)로 둡니다.
  5. isRegexp가 true이면 TypeError 예외를 던집니다.
  6. searchString을 ? ToString(searchString)으로 설정합니다.
  7. length를 string의 길이로 둡니다.
  8. start를 ? ToIntegerOrInfinity(position)을 0과 length 사이로 제한한 결과로 둡니다.
  9. 단언: position이 undefined이면 start는 0입니다.
  10. searchLength를 searchString의 길이로 둡니다.
  11. searchLength = 0이면 true를 반환합니다.
  12. end를 start + searchLength로 둡니다.
  13. end > length이면 false를 반환합니다.
  14. substring을 string의 start부터 end까지의 부분 문자열로 둡니다.
  15. substring이 searchString이면 true를 반환합니다.
  16. false를 반환합니다.
참고 1

첫 번째 인수가 RegExp이면 예외를 던지도록 명시한 것은 향후 판에서 이러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.25 String.prototype.substring ( start, end )

이 메서드는 이 객체를 String으로 변환한 결과의 인덱스 start에서 시작하여 String의 인덱스 end 직전까지 이어지는 부분 문자열(end가 undefined이면 String의 끝까지)을 반환합니다. 결과는 String 객체가 아니라 String 값입니다.

어느 인수든 NaN이거나 음수이면 0으로 대체되고, 어느 인수든 String의 길이보다 엄격하게 크면 String의 길이로 대체됩니다.

start가 end보다 엄격하게 크면 서로 교환됩니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. length를 string의 길이로 둡니다.
  5. finalStart를 ? ToIntegerOrInfinity(start)을 0과 length 사이로 제한한 결과로 둡니다.
  6. 단언: start가 undefined이면 finalStart는 0입니다.
  7. end가 undefined이면 finalEnd를 length로 둡니다. 그렇지 않으면 finalEnd를 ? ToIntegerOrInfinity(end)을 0과 length 사이로 제한한 결과로 둡니다.
  8. from을 min(finalStart, finalEnd)으로 둡니다.
  9. to를 max(finalStart, finalEnd)로 둡니다.
  10. string의 from부터 to까지의 부분 문자열을 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호스트 환경의 현재 로케일 관례에 대응하는 로케일 민감 결과를 생성하도록 의도된다는 점을 제외하면 toLowerCase와 정확히 동일하게 동작합니다. 해당 언어의 규칙이 일반적인 유니코드 대소문자 매핑과 충돌하는 소수의 경우(예: 터키어)에만 차이가 있습니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다:

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호스트 환경의 현재 로케일 관례에 대응하는 로케일 민감 결과를 생성하도록 의도된다는 점을 제외하면 toUpperCase와 정확히 동일하게 동작합니다. 해당 언어의 규칙이 일반적인 유니코드 대소문자 매핑과 충돌하는 소수의 경우(예: 터키어)에만 차이가 있습니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.28 String.prototype.toLowerCase ( )

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. sText를 StringToCodePoints(string)로 둡니다.
  5. lowerText를 Unicode Default Case Conversion 알고리즘에 따라 toLowercase(sText)로 둡니다.
  6. lowercaseString을 CodePointsToString(lowerText)로 둡니다.
  7. lowercaseString을 반환합니다.

결과는 Unicode Character Database의 로케일 비민감 대소문자 매핑에 따라 파생되어야 합니다(이는 UnicodeData.txt 파일뿐만 아니라 함께 제공되는 SpecialCasing.txt 파일의 모든 로케일 비민감 매핑도 명시적으로 포함합니다).

참고 1

일부 코드 포인트의 대소문자 매핑은 여러 코드 포인트를 생성할 수 있습니다. 이 경우 결과 String의 길이는 소스 String과 같지 않을 수 있습니다. toUpperCase와 toLowerCase 모두 문맥 민감 동작을 하므로 두 메서드는 대칭적이지 않습니다. 즉, s.toUpperCase().toLowerCase()는 반드시 s.toLowerCase()와 같지는 않습니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.29 String.prototype.toString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. ? ThisStringValue(this 값)를 반환합니다.
참고

String 객체의 경우 이 메서드는 우연히 valueOf 메서드와 동일한 것을 반환합니다.

22.1.3.30 String.prototype.toUpperCase ( )

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

String이 Unicode Default Case Conversion의 toUppercase 알고리즘을 사용하여 매핑된다는 점을 제외하면 String.prototype.toLowerCase와 정확히 동일하게 동작합니다.

참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.31 String.prototype.toWellFormed ( )

이 메서드는 서로게이트 쌍의 일부가 아닌 모든 선행 서로게이트와 후행 서로게이트를 U+FFFD (REPLACEMENT CHARACTER)로 대체한 이 객체의 String 표현을 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? RequireObjectCoercible(thisValue)를 수행합니다.
  3. string을 ? ToString(thisValue)으로 둡니다.
  4. stringLength를 string의 길이로 둡니다.
  5. k를 0으로 둡니다.
  6. result를 빈 String으로 둡니다.
  7. k < stringLength인 동안 다음을 반복합니다.
    1. codePoint를 CodePointAt(string, k)로 둡니다.
    2. codePoint.[[IsUnpairedSurrogate]]가 true이면, 다음을 수행합니다.
      1. result를 result와 0xFFFD (REPLACEMENT CHARACTER)의 문자열 연결로 설정합니다.
    3. 그렇지 않으면,
      1. result를 result와 UTF16EncodeCodePoint(codePoint.[[CodePoint]])의 문자열 연결로 설정합니다.
    4. k를 k + codePoint.[[CodeUnitCount]]로 설정합니다.
  8. result를 반환합니다.

22.1.3.32 String.prototype.trim ( )

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호출되면 다음 단계를 수행합니다:

  1. thisValue를 this 값으로 둡니다.
  2. ? TrimString(thisValue, start+end)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.32.1 TrimString ( arg, where )

추상 연산 TrimString. 인수 arg (ECMAScript 언어 값) 및 where ((start, end 또는 start+end)). 반환값: (정상 완료 (값: String) 또는 throw 완료). 6.1.4에 설명된 대로 arg를 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다. 호출되면 다음 단계를 수행한다.

  1. ? RequireObjectCoercible(arg)를 수행합니다.
  2. string을 ? ToString(arg)으로 둡니다.
  3. where가 start이면, 다음을 수행합니다.
    1. trimmedString을 string의 앞쪽 공백을 제거한 복사본인 String 값으로 둡니다.
  4. 그렇지 않고 where가 end이면, 다음을 수행합니다.
    1. trimmedString을 string의 뒤쪽 공백을 제거한 복사본인 String 값으로 둡니다.
  5. 그렇지 않으면,
    1. 단언: where는 start+end입니다.
    2. trimmedString을 string의 앞쪽과 뒤쪽 공백을 모두 제거한 복사본인 String 값으로 둡니다.
  6. trimmedString을 반환합니다.

공백의 정의는 WhiteSpace와 LineTerminator의 합집합입니다. 유니코드 코드 포인트가 유니코드 일반 범주 “Space_Separator” (“Zs”)에 속하는지 결정할 때 코드 단위 시퀀스는 6.1.4에 명시된 대로 UTF-16 인코딩 코드 포인트 시퀀스로 해석됩니다.

22.1.3.33 String.prototype.trimEnd ( )

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호출되면 다음 단계를 수행합니다:

  1. string을 this 값으로 둡니다.
  2. ? TrimString(string, end)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.34 String.prototype.trimStart ( )

이 메서드는 6.1.4에 설명된 대로 String 값을 UTF-16 인코딩 코드 포인트의 시퀀스로 해석합니다.

호출되면 다음 단계를 수행합니다:

  1. string을 this 값으로 둡니다.
  2. ? TrimString(string, start)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 String 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

22.1.3.35 String.prototype.valueOf ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. ? ThisStringValue(this 값)를 반환합니다.

22.1.3.35.1 ThisStringValue ( arg )

추상 연산 ThisStringValue. 인수 arg (ECMAScript 언어 값). 반환값: (정상 완료 (값: String) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. arg가 String이면 arg를 반환합니다.
  2. arg가 Object이고 arg에 [[StringData]] 내부 슬롯이 있으면, 다음을 수행합니다.
    1. string을 arg.[[StringData]]로 둡니다.
    2. 단언: string은 String입니다.
    3. string을 반환합니다.
  3. TypeError 예외를 던집니다.

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

이 메서드는 String 값의 코드 포인트를 순회하면서 각 코드 포인트를 String 값으로 반환하는 반복자 객체를 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. string을 this 값으로 둡니다.
  2. ? RequireObjectCoercible(string)를 수행합니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. closure를 매개변수가 없고 string을 캡처하며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. length를 string의 길이로 둡니다.
    2. position을 0으로 둡니다.
    3. position < length인 동안 다음을 반복합니다.
      1. codePoint를 CodePointAt(string, position)로 둡니다.
      2. nextIndex를 position + codePoint.[[CodeUnitCount]]로 둡니다.
      3. resultString을 string의 position부터 nextIndex까지의 부분 문자열로 둡니다.
      4. position을 nextIndex로 설정합니다.
      5. ? GeneratorYield(CreateIteratorResultObject(resultString, false))를 수행합니다.
    4. NormalCompletion(unused)을 반환합니다.
  5. CreateIteratorFromClosure(closure, "%StringIteratorPrototype%", %StringIteratorPrototype%)를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.iterator]"입니다.

22.1.4 String 인스턴스의 프로퍼티

String 인스턴스는 String 특수 객체이며 이러한 객체에 지정된 내부 메서드를 갖습니다. String 인스턴스는 String 프로토타입 객체에서 프로퍼티를 상속합니다. String 인스턴스에는 [[StringData]] 내부 슬롯도 있습니다. [[StringData]] 내부 슬롯은 이 String 객체가 나타내는 String 값입니다.

String 인스턴스는 "length" 프로퍼티와 정수 인덱스 이름을 갖는 열거 가능한 프로퍼티 집합을 갖습니다.

22.1.4.1 length

이 String 객체가 나타내는 String 값의 요소 수입니다.

String 객체가 초기화되면 이 프로퍼티는 변경되지 않습니다. 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

22.1.5 String Iterator 객체

String Iterator는 특정 String 인스턴스 객체에 대한 특정 순회를 나타내는 객체입니다. String Iterator 객체에는 이름 있는 생성자가 없습니다. 대신 String Iterator 객체는 String 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

22.1.5.1 %StringIteratorPrototype% 객체

%StringIteratorPrototype% 객체는:

22.1.5.1.1 %StringIteratorPrototype%.next ( )

  1. ? GeneratorResume(this 값, empty, "%StringIteratorPrototype%")를 반환합니다.

22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "String Iterator"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

22.2 RegExp(정규 표현식) 객체

RegExp 객체는 정규 표현식과 관련 플래그를 포함합니다.

참고

정규 표현식의 형식과 기능은 Perl 5 프로그래밍 언어의 정규 표현식 기능을 모델로 합니다.

22.2.1 패턴

RegExp 생성자는 입력 패턴 String에 다음 문법을 적용합니다. 문법이 String을 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] 참고 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 & - ! # % , : ; < = > @ ` ~ 참고 2

이 절의 여러 생성식에는 B.1.2 절에서 대체 정의가 제공됩니다.

22.2.1.1 Static Semantics: 조기 오류

참고

이 절은 B.1.2.1에서 수정됩니다.

Pattern :: Disjunction QuantifierPrefix :: { DecimalDigits , DecimalDigits } Atom :: (? RegularExpressionModifiers : Disjunction ) Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction ) AtomEscape :: k GroupName AtomEscape :: DecimalEscape NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue CharacterClassEscape :: P{ UnicodePropertyValueExpression } CharacterClass :: [^ ClassContents ] NestedClass :: [^ ClassContents ] ClassSetRange :: ClassSetCharacter - ClassSetCharacter

22.2.1.2 Static Semantics: CountLeftCapturingParensWithin ( parseNode )

추상 연산 CountLeftCapturingParensWithin. 인수 parseNode (구문 분석 노드). 반환값: 음이 아닌 정수. parseNode 안의 왼쪽 캡처링 괄호 수를 반환합니다. 왼쪽 캡처링 괄호는 Atom :: ( GroupSpecifieropt Disjunction ) 생성식의 ( 터미널과 일치하는 모든 ( 패턴 문자입니다.

참고

이 절은 B.1.2.2에서 수정됩니다.

호출되면 다음 단계를 수행한다.

  1. 단언: parseNode는 RegExp Pattern 문법에 있는 생성식의 인스턴스입니다.
  2. parseNode 안에 포함된 Atom :: ( GroupSpecifieropt Disjunction ) Parse Node의 수를 반환합니다.

22.2.1.3 Static Semantics: CountLeftCapturingParensBefore ( parseNode )

추상 연산 CountLeftCapturingParensBefore. 인수 parseNode (구문 분석 노드). 반환값: 음이 아닌 정수. 둘러싸는 패턴 안에서 parseNode의 왼쪽에 나타나는 왼쪽 캡처링 괄호의 수를 반환합니다.

참고

이 절은 B.1.2.2에서 수정됩니다.

호출되면 다음 단계를 수행한다.

  1. 단언: parseNode는 RegExp Pattern 문법에 있는 생성식의 인스턴스입니다.
  2. pattern을 parseNode를 포함하는 Pattern으로 둡니다.
  3. pattern 안에 포함되고 parseNode보다 앞에 나타나거나 parseNode를 포함하는 Atom :: ( GroupSpecifieropt Disjunction ) Parse Node의 수를 반환합니다.

22.2.1.4 Static Semantics: MightBothParticipate ( x, y )

추상 연산 MightBothParticipate. 인수 x (구문 분석 노드) 및 y (구문 분석 노드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. 단언: x와 y는 동일한 둘러싸는 Pattern을 갖습니다.
  2. 둘러싸는 Pattern에 Disjunction :: Alternative | Disjunction Parse Node가 포함되어 있고 x가 Alternative 안에 포함되며 y가 파생된 Disjunction 안에 포함되거나, x가 파생된 Disjunction 안에 포함되며 y가 Alternative 안에 포함되면 false를 반환합니다.
  3. true를 반환합니다.

22.2.1.5 Static Semantics: CapturingGroupNumber

구문 지향 연산 CapturingGroupNumber. 인수 없음. 반환값: 양의 정수.

참고

이 절은 B.1.2.1에서 수정됩니다.

다음 생성 규칙별로 정의된다.

DecimalEscape :: NonZeroDigit
  1. NonZeroDigit의 MV를 반환합니다.
DecimalEscape :: NonZeroDigit DecimalDigits
  1. n을 DecimalDigits의 코드 포인트 수로 둡니다.
  2. (NonZeroDigit의 MV × 10n에 DecimalDigits의 MV를 더한 값)를 반환합니다.

“NonZeroDigit의 MV”와 “DecimalDigits의 MV” 정의는 12.9.3에 있습니다.

22.2.1.6 Static Semantics: IsCharacterClass

구문 지향 연산 IsCharacterClass. 인수 없음. 반환값: Boolean.

참고

이 절은 B.1.2.3에서 수정됩니다.

다음 생성 규칙별로 정의된다.

ClassAtom :: - ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - ClassEscape :: b - CharacterEscape
  1. false를 반환합니다.
ClassEscape :: CharacterClassEscape
  1. true를 반환합니다.

22.2.1.7 Static Semantics: CharacterValue

구문 지향 연산 CharacterValue. 인수 없음. 반환값: 음이 아닌 정수.

참고 1

이 절은 B.1.2.4에서 수정됩니다.

다음 생성 규칙별로 정의된다.

ClassAtom :: -
  1. U+002D (HYPHEN-MINUS)의 숫자 값을 반환합니다.
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. codePoint를 SourceCharacter와 일치하는 코드 포인트로 둡니다.
  2. codePoint의 숫자 값을 반환합니다.
ClassEscape :: b
  1. U+0008 (BACKSPACE)의 숫자 값을 반환합니다.
ClassEscape :: -
  1. U+002D (HYPHEN-MINUS)의 숫자 값을 반환합니다.
CharacterEscape :: ControlEscape
  1. 표 63에 따른 숫자 값을 반환합니다.
표 63: ControlEscape 코드 포인트 값
ControlEscape 숫자 값 코드 포인트 유니코드 이름 기호
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. codePoint를 AsciiLetter와 일치하는 코드 포인트로 둡니다.
  2. i를 codePoint의 숫자 값으로 둡니다.
  3. i를 32로 나눈 나머지를 반환합니다.
CharacterEscape :: 0 [lookahead ∉ DecimalDigit]
  1. U+0000 (NULL)의 숫자 값을 반환합니다.
참고 2

\0은 <NUL> 문자를 나타내며 뒤에 십진 숫자가 올 수 없습니다.

CharacterEscape :: HexEscapeSequence
  1. HexEscapeSequence의 MV를 반환합니다.
RegExpUnicodeEscapeSequence :: u HexLeadSurrogate \u HexTrailSurrogate
  1. lead를 HexLeadSurrogate의 CharacterValue로 둡니다.
  2. trail을 HexTrailSurrogate의 CharacterValue로 둡니다.
  3. codePoint를 UTF16SurrogatePairToCodePoint(lead, trail)로 둡니다.
  4. codePoint의 숫자 값을 반환합니다.
RegExpUnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits의 MV를 반환합니다.
RegExpUnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint의 MV를 반환합니다.
HexLeadSurrogate :: Hex4Digits HexTrailSurrogate :: Hex4Digits HexNonSurrogate :: Hex4Digits
  1. Hex4Digits의 MV를 반환합니다.
CharacterEscape :: IdentityEscape
  1. codePoint를 IdentityEscape와 일치하는 코드 포인트로 둡니다.
  2. codePoint의 숫자 값을 반환합니다.
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
  1. codePoint를 SourceCharacter와 일치하는 코드 포인트로 둡니다.
  2. codePoint의 숫자 값을 반환합니다.
ClassSetCharacter :: \ ClassSetReservedPunctuator
  1. codePoint를 ClassSetReservedPunctuator와 일치하는 코드 포인트로 둡니다.
  2. codePoint의 숫자 값을 반환합니다.
ClassSetCharacter :: \b
  1. U+0008 (BACKSPACE)의 숫자 값을 반환합니다.

22.2.1.8 Static Semantics: MayContainStrings

구문 지향 연산 MayContainStrings. 인수 없음. 반환값: Boolean. 다음 생성 규칙별로 정의된다.

CharacterClassEscape :: d D s S w W P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue NestedClass :: [^ ClassContents ] ClassContents :: [empty] NonemptyClassRanges ClassSetOperand :: ClassSetCharacter
  1. false를 반환합니다.
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. LoneUnicodePropertyNameOrValue과 일치하는 소스 텍스트가 표 67의 “Property name” 열에 나열된 문자열의 이진 프로퍼티이면 true를 반환합니다.
  2. false를 반환합니다.
ClassUnion :: ClassSetRange ClassUnionopt
  1. ClassUnion이 존재하면 ClassUnion의 MayContainStrings를 반환합니다.
  2. false를 반환합니다.
ClassUnion :: ClassSetOperand ClassUnionopt
  1. ClassSetOperand의 MayContainStrings가 true이면 true를 반환합니다.
  2. ClassUnion이 존재하면 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 Static Semantics: GroupSpecifiersThatMatch ( thisGroupName )

추상 연산 GroupSpecifiersThatMatch. 인수 thisGroupName (a GroupName Parse Node). 반환값: 리스트 (요소: GroupSpecifier Parse Nodes). 호출되면 다음 단계를 수행한다.

  1. name을 thisGroupName의 CapturingGroupName으로 둡니다.
  2. pattern을 thisGroupName을 포함하는 Pattern으로 둡니다.
  3. result를 새로운 빈 List로 둡니다.
  4. pattern이 포함하는 각 GroupSpecifier groupSpecifier에 대해 다음을 수행합니다.
    1. groupSpecifier의 CapturingGroupName이 name이면, 다음을 수행합니다.
      1. groupSpecifier를 result에 추가합니다.
  5. result를 반환합니다.

22.2.1.10 Static Semantics: CapturingGroupName

구문 지향 연산 CapturingGroupName. 인수 없음. 반환값: String. 다음 생성 규칙별로 정의된다.

GroupName :: < RegExpIdentifierName >
  1. nameUnescaped를 RegExpIdentifierName의 RegExpIdentifierCodePoints로 둡니다.
  2. CodePointsToString(nameUnescaped)을 반환합니다.

22.2.1.11 Static Semantics: RegExpIdentifierCodePoints

구문 지향 연산 RegExpIdentifierCodePoints. 인수 없음. 반환값: 리스트 (요소: 코드 포인트). 다음 생성 규칙별로 정의된다.

RegExpIdentifierName :: RegExpIdentifierStart
  1. codePoint를 RegExpIdentifierStart의 RegExpIdentifierCodePoint로 둡니다.
  2. « codePoint »을 반환합니다.
RegExpIdentifierName :: RegExpIdentifierName RegExpIdentifierPart
  1. codePoints를 파생된 RegExpIdentifierName의 RegExpIdentifierCodePoints로 둡니다.
  2. codePoint를 RegExpIdentifierPart의 RegExpIdentifierCodePoint로 둡니다.
  3. codePoints와 « codePoint »의 목록 연결을 반환합니다.

22.2.1.12 Static Semantics: RegExpIdentifierCodePoint

구문 지향 연산 RegExpIdentifierCodePoint. 인수 없음. 반환값: 코드 포인트. 다음 생성 규칙별로 정의된다.

RegExpIdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar와 일치하는 코드 포인트를 반환합니다.
RegExpIdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar와 일치하는 코드 포인트를 반환합니다.
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
  1. 숫자 값이 RegExpUnicodeEscapeSequence의 CharacterValue인 코드 포인트를 반환합니다.
RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate
  1. lead를 숫자 값이 UnicodeLeadSurrogate와 일치하는 코드 포인트의 숫자 값인 코드 단위로 둡니다.
  2. trail을 숫자 값이 UnicodeTrailSurrogate와 일치하는 코드 포인트의 숫자 값인 코드 단위로 둡니다.
  3. UTF16SurrogatePairToCodePoint(lead, trail)를 반환합니다.

22.2.2 패턴 의미론

정규 표현식 패턴은 아래에 설명된 과정을 사용하여 Abstract Closure로 변환됩니다. 결과가 동일하다면 구현체는 아래에 나열된 알고리즘보다 더 효율적인 알고리즘을 사용하는 것이 권장됩니다. Abstract Closure는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯 값으로 사용됩니다.

Pattern의 관련 플래그에 u도 v도 포함되어 있지 않으면 해당 Pattern은 BMP 패턴입니다. 그렇지 않으면 유니코드 패턴입니다. BMP 패턴은 Basic Multilingual Plane 범위의 유니코드 코드 포인트인 16비트 값의 시퀀스로 구성된 것으로 해석되는 String과 일치합니다. 유니코드 패턴은 UTF-16으로 인코딩된 유니코드 코드 포인트로 구성된 것으로 해석되는 String과 일치합니다. BMP 패턴의 동작을 설명하는 문맥에서 “문자”는 단일 16비트 유니코드 BMP 코드 포인트를 의미합니다. 유니코드 패턴의 동작을 설명하는 문맥에서 “문자”는 UTF-16 인코딩 코드 포인트(6.1.4)를 의미합니다. 어느 문맥에서든 “문자 값”은 대응하는 인코딩되지 않은 코드 포인트의 숫자 값을 의미합니다.

Pattern의 구문과 의미론은 Pattern의 소스 텍스트가 각 SourceCharacter가 하나의 유니코드 코드 포인트에 대응하는 SourceCharacter 값의 List인 것처럼 정의됩니다. BMP 패턴에 비-BMP SourceCharacter가 포함되어 있으면 전체 패턴을 UTF-16으로 인코딩하고 해당 인코딩의 개별 코드 단위를 List의 요소로 사용합니다.

참고

예를 들어 소스 텍스트에서 단일 비-BMP 문자 U+1D11E (MUSICAL SYMBOL G CLEF)로 표현된 패턴을 생각해 보시기 바랍니다. 유니코드 패턴으로 해석하면 단일 코드 포인트 U+1D11E로 구성된 단일 요소(문자) List가 됩니다. 그러나 BMP 패턴으로 해석하면 먼저 UTF-16으로 인코딩되어 코드 단위 0xD834와 0xDD1E로 구성된 두 요소 List가 생성됩니다.

패턴은 비-BMP 문자가 UTF-16으로 인코딩된 ECMAScript String 값으로 RegExp 생성자에 전달됩니다. 예를 들어 단일 문자 MUSICAL SYMBOL G CLEF 패턴을 String 값으로 표현하면 요소가 코드 단위 0xD834와 0xDD1E인 길이 2의 String입니다. 따라서 두 패턴 문자로 구성된 BMP 패턴으로 처리하기 위해 문자열을 추가로 변환할 필요는 없습니다. 그러나 유니코드 패턴으로 처리하려면 유일한 요소가 단일 패턴 문자, 즉 코드 포인트 U+1D11E인 List를 생성할 때 UTF16SurrogatePairToCodePoint를 사용해야 합니다.

구현체는 실제로 UTF-16으로 또는 UTF-16에서 이러한 변환을 수행하지 않을 수 있지만, 이 명세의 의미론은 패턴 일치 결과가 그러한 변환이 수행된 것과 같아야 함을 요구합니다.

22.2.2.1 표기법

아래 설명에서는 다음 내부 데이터 구조를 사용합니다:

  • CharSetElement는 다음 두 엔티티 중 하나입니다:
    • regexpRecord.[[UnicodeSets]]가 false이면 CharSetElement는 위의 패턴 의미론에서 말하는 문자입니다.
    • regexpRecord.[[UnicodeSets]]가 true이면 CharSetElement는 요소가 위의 패턴 의미론에서 말하는 문자인 시퀀스입니다. 여기에는 빈 시퀀스, 한 문자의 시퀀스 및 둘 이상의 문자의 시퀀스가 포함됩니다. 편의를 위해 이러한 종류의 CharSetElement를 다룰 때 개별 문자는 한 문자의 시퀀스와 상호 교환 가능하게 취급합니다.
  • CharSet은 CharSetElement의 수학적 집합입니다.
  • CaptureRange는 캡처에 포함된 문자 범위를 나타내는 Record { [[StartIndex]], [[EndIndex]] }입니다. 여기서 [[StartIndex]]는 input 안에서 범위의 시작 인덱스(포함)를 나타내는 정수이고 [[EndIndex]]는 input 안에서 범위의 끝 인덱스(제외)를 나타내는 정수입니다. 모든 CaptureRange에서 이러한 인덱스는 [[StartIndex]] ≤ [[EndIndex]]라는 불변 조건을 만족해야 합니다.
  • MatchState는 Record { [[Input]], [[EndIndex]], [[Captures]] }입니다. 여기서 [[Input]]은 일치 대상 String을 나타내는 문자 List이고, [[EndIndex]]는 정수이며, [[Captures]]는 패턴의 각 왼쪽 캡처링 괄호마다 하나의 값을 갖는 List입니다. MatchState는 정규 표현식 일치 알고리즘에서 부분 일치 상태를 나타내는 데 사용됩니다. [[EndIndex]]는 지금까지 패턴이 일치한 마지막 입력 문자의 인덱스에 1을 더한 값이며, [[Captures]]는 캡처링 괄호의 결과를 보관합니다. [[Captures]]의 nth 요소는 nth 캡처링 괄호 집합이 캡처한 문자 범위를 나타내는 CaptureRange이거나, nth 캡처링 괄호 집합에 아직 도달하지 않은 경우 undefined입니다. 백트래킹 때문에 일치 과정 중 언제든 여러 MatchState가 사용 중일 수 있습니다.
  • MatcherContinuation은 하나의 MatchState 인수를 받고 MatchState 또는 failure를 반환하는 Abstract Closure입니다. MatcherContinuation은 MatchState 인수가 지정한 중간 상태에서 시작하여 input에 대해 패턴의 남은 부분(클로저가 캡처한 값으로 지정됨)을 일치시키려고 시도합니다. 일치가 성공하면 MatcherContinuation은 도달한 최종 MatchState를 반환하고, 일치가 실패하면 failure를 반환합니다.
  • Matcher는 두 인수, 즉 MatchState와 MatcherContinuation을 받고 MatchState 또는 failure를 반환하는 Abstract Closure입니다. Matcher는 MatchState 인수가 지정한 중간 상태에서 시작하여 MatchState의 [[Input]]에 대해 패턴의 중간 하위 패턴(클로저가 캡처한 값으로 지정됨)을 일치시키려고 시도합니다. MatcherContinuation 인수는 패턴의 나머지를 일치시키는 클로저여야 합니다. 패턴의 하위 패턴을 일치시켜 새로운 MatchState를 얻은 뒤 Matcher는 새 MatchState에 대해 MatcherContinuation을 호출하여 패턴의 나머지도 일치할 수 있는지 검사합니다. 가능하면 Matcher는 MatcherContinuation이 반환한 MatchState를 반환하고, 그렇지 않으면 선택 지점에서 다른 선택을 시도하면서 성공하거나 모든 가능성이 소진될 때까지 MatcherContinuation을 반복 호출할 수 있습니다.

22.2.2.1.1 RegExp Record

RegExp Record는 컴파일 중 및 필요한 경우 일치 중에 필요한 RegExp 정보를 저장하는 데 사용하는 Record입니다.

다음 필드를 갖습니다:

표 64: RegExp Record 필드
필드 이름 값 의미
[[IgnoreCase]] a Boolean RegExp의 플래그에 "i"가 나타나는지 나타냅니다.
[[Multiline]] a Boolean RegExp의 플래그에 "m"이 나타나는지 나타냅니다.
[[DotAll]] a Boolean RegExp의 플래그에 "s"가 나타나는지 나타냅니다.
[[Unicode]] a Boolean RegExp의 플래그에 "u"가 나타나는지 나타냅니다.
[[UnicodeSets]] a Boolean RegExp의 플래그에 "v"가 나타나는지 나타냅니다.
[[CapturingGroupsCount]] a non-negative integer RegExp 패턴의 왼쪽 캡처링 괄호 수입니다.

22.2.2.2 Runtime Semantics: CompilePattern

구문 지향 연산 CompilePattern. 인수 regexpRecord (RegExp 레코드). 반환값: an Abstract Closure that takes a List of characters and a non-negative integer and returns either a MatchState or failure. 다음 생성 규칙별로 정의된다.

Pattern :: Disjunction
  1. m을 인수 regexpRecord 및 forward를 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. regexpRecord와 m을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (input, index)를 갖는 새로운 Abstract Closure를 반환합니다:
    1. 단언: input은 문자의 List입니다.
    2. 단언: 0 ≤ index ≤ input의 요소 수입니다.
    3. c를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. y를 반환합니다.
    4. capability를 1부터 regexpRecord.[[CapturingGroupsCount]]까지 인덱싱된 regexpRecord.[[CapturingGroupsCount]]개의 undefined 값으로 구성된 List로 둡니다.
    5. x를 MatchState { [[Input]]: input, [[EndIndex]]: index, [[Captures]]: capability }로 둡니다.
    6. m(x, c)를 반환합니다.
참고

Pattern은 Abstract Closure 값으로 컴파일됩니다. 그런 다음 RegExpBuiltinExec는 이 프로시저를 문자 List와 해당 List 안의 오프셋에 적용하여 패턴이 List 안의 정확히 해당 오프셋에서 시작하여 일치하는지, 그리고 일치하는 경우 캡처링 괄호의 값이 무엇인지 결정할 수 있습니다. 22.2.2의 알고리즘은 패턴 컴파일이 SyntaxError 예외를 던질 수 있도록 설계되어 있습니다. 반면 패턴이 성공적으로 컴파일된 후에는 결과 Abstract Closure를 적용하여 문자 List 안에서 일치를 찾는 과정은 예외를 던질 수 없습니다(메모리 부족처럼 어디서든 발생할 수 있는 구현체 정의 예외는 제외).

22.2.2.3 Runtime Semantics: CompileSubpattern

구문 지향 연산 CompileSubpattern. 인수 regexpRecord (RegExp 레코드) 및 direction ((forward 또는 backward)). 반환값: Matcher.

참고 1

이 절은 B.1.2.5에서 수정됩니다.

다음 생성 규칙별로 정의된다.

Disjunction :: Alternative | Disjunction
  1. m1을 인수 regexpRecord 및 direction을 사용한 Alternative의 CompileSubpattern으로 둡니다.
  2. m2를 인수 regexpRecord 및 direction을 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  3. MatchTwoAlternatives(m1, m2)를 반환합니다.
참고 2

| 정규 표현식 연산자는 두 대안을 구분합니다. 패턴은 먼저 왼쪽 Alternative(정규 표현식의 후속 부분이 이어짐)를 일치시키려고 시도하고, 실패하면 오른쪽 Disjunction(정규 표현식의 후속 부분이 이어짐)을 일치시키려고 시도합니다. 왼쪽 Alternative, 오른쪽 Disjunction 및 후속 부분에 모두 선택 지점이 있으면 왼쪽 Alternative의 다음 선택으로 이동하기 전에 후속 부분의 모든 선택을 시도합니다. 왼쪽 Alternative의 선택이 소진되면 왼쪽 Alternative 대신 오른쪽 Disjunction을 시도합니다. |에 의해 건너뛴 패턴 부분 안의 캡처링 괄호는 String 대신 undefined 값을 생성합니다. 따라서 예를 들어,

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

는 "ab"가 아니라 "a" 결과를 반환합니다. 또한,

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

는 다음 배열을 반환하고

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

다음 배열은 반환하지 않습니다.

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

두 대안을 시도하는 순서는 direction 값과 무관합니다.

Alternative :: [empty]
  1. EmptyMatcher()를 반환합니다.
Alternative :: Alternative Term
  1. m1을 인수 regexpRecord 및 direction을 사용한 Alternative의 CompileSubpattern으로 둡니다.
  2. m2를 인수 regexpRecord 및 direction을 사용한 Term의 CompileSubpattern으로 둡니다.
  3. MatchSequence(m1, m2, direction)를 반환합니다.
참고 3

연속된 Term은 input의 연속된 부분을 동시에 일치시키려고 시도합니다. direction이 forward이고 왼쪽 Alternative, 오른쪽 Term 및 정규 표현식의 후속 부분에 모두 선택 지점이 있으면 오른쪽 Term의 다음 선택으로 이동하기 전에 후속 부분의 모든 선택을 시도하며, 왼쪽 Alternative의 다음 선택으로 이동하기 전에 오른쪽 Term의 모든 선택을 시도합니다. direction이 backward이면 Alternative와 Term의 평가 순서가 반대가 됩니다.

Term :: Assertion
  1. 인수 regexpRecord를 사용한 Assertion의 CompileAssertion을 반환합니다.
참고 4

결과 Matcher는 direction과 무관합니다.

Term :: Atom
  1. 인수 regexpRecord 및 direction을 사용한 Atom의 CompileAtom을 반환합니다.
Term :: Atom Quantifier
  1. m을 인수 regexpRecord 및 direction을 사용한 Atom의 CompileAtom으로 둡니다.
  2. q를 Quantifier의 CompileQuantifier로 둡니다.
  3. 단언: q.[[Min]] ≤ q.[[Max]]입니다.
  4. parenIndex를 CountLeftCapturingParensBefore(Term)로 둡니다.
  5. parenCount를 CountLeftCapturingParensWithin(Atom)로 둡니다.
  6. m, q, parenIndex 및 parenCount를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, c)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: x는 MatchState입니다.
    2. 단언: c는 MatcherContinuation입니다.
    3. RepeatMatcher(m, q.[[Min]], q.[[Max]], q.[[Greedy]], x, c, parenIndex, parenCount)를 반환합니다.

22.2.2.3.1 RepeatMatcher ( m, min, max, greedy, matchState, continue, parenIndex, parenCount )

추상 연산 RepeatMatcher. 인수 m (Matcher), min (음이 아닌 정수), max ((음이 아닌 정수 또는 +∞)), greedy (Boolean), matchState (MatchState), continue (MatcherContinuation), parenIndex (음이 아닌 정수) 및 parenCount (음이 아닌 정수). 반환값: (MatchState 또는 failure). 호출되면 다음 단계를 수행한다.

  1. max = 0이면 continue(matchState)를 반환합니다.
  2. d를 m, min, max, greedy, matchState, continue, parenIndex 및 parenCount를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
    1. 단언: y는 MatchState입니다.
    2. min = 0이고 y.[[EndIndex]] = matchState.[[EndIndex]]이면 failure를 반환합니다.
    3. min = 0이면 min2를 0으로 둡니다. 그렇지 않으면 min2를 min - 1로 둡니다.
    4. max = +∞이면 max2를 +∞로 둡니다. 그렇지 않으면 max2를 max - 1로 둡니다.
    5. RepeatMatcher(m, min2, max2, greedy, y, continue, parenIndex, parenCount)를 반환합니다.
  3. capability를 matchState.[[Captures]]의 복사본으로 둡니다.
  4. parenIndex + 1부터 parenIndex + parenCount까지의 폐구간에 속하는 각 정수 k에 대해 capability[k]를 undefined로 설정합니다.
  5. input을 matchState.[[Input]]으로 둡니다.
  6. e를 matchState.[[EndIndex]]로 둡니다.
  7. xr를 MatchState { [[Input]]: input, [[EndIndex]]: e, [[Captures]]: capability }로 둡니다.
  8. min ≠ 0이면 m(xr, d)를 반환합니다.
  9. greedy가 false이면, 다음을 수행합니다.
    1. z를 continue(matchState)로 둡니다.
    2. z가 failure가 아니면 z를 반환합니다.
    3. m(xr, d)를 반환합니다.
  10. z를 m(xr, d)로 둡니다.
  11. z가 failure가 아니면 z를 반환합니다.
  12. continue(matchState)를 반환합니다.
참고 1

Quantifier가 뒤따르는 Atom은 Quantifier가 지정한 횟수만큼 반복됩니다. Quantifier는 비탐욕적일 수 있으며, 이 경우 Atom 패턴은 후속 부분과 여전히 일치하는 범위에서 가능한 한 적게 반복됩니다. 또는 탐욕적일 수 있으며, 이 경우 Atom 패턴은 후속 부분과 여전히 일치하는 범위에서 가능한 한 많이 반복됩니다. 일치하는 입력 문자 시퀀스가 아니라 Atom 패턴 자체가 반복되므로 Atom의 서로 다른 반복은 서로 다른 입력 부분 문자열과 일치할 수 있습니다.

참고 2

Atom과 정규 표현식의 후속 부분에 모두 선택 지점이 있으면 Atom은 먼저 가능한 한 많이(비탐욕적이면 가능한 한 적게) 일치합니다. 후속 부분의 모든 선택은 Atom의 마지막 반복에서 다음 선택으로 이동하기 전에 시도됩니다. Atom의 마지막(nth) 반복의 모든 선택은 마지막에서 두 번째(n - 1)st 반복의 다음 선택으로 이동하기 전에 시도됩니다. 이 시점에서 Atom을 더 많이 또는 더 적게 반복할 수 있음이 밝혀질 수 있으며, 이러한 가능성은 (다시 가능한 한 적게 또는 많이 시작하여) 소진된 뒤 (n - 1)st 반복의 다음 선택으로 이동하는 식으로 계속됩니다.

다음을 비교해 보시기 바랍니다.

/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"]

위의 선택 지점 순서를 이용하면 두 숫자(단항 표기법으로 표현됨)의 최대공약수를 계산하는 정규 표현식을 작성할 수 있습니다. 다음 예는 10과 15의 최대공약수를 계산합니다:

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

이는 단항 표기법으로 된 최대공약수 "aaaaa"를 반환합니다.

참고 3

RepeatMatcher의 4 단계는 Atom이 반복될 때마다 Atom의 캡처를 지웁니다. 다음 정규 표현식에서 그 동작을 확인할 수 있습니다.

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

이는 다음 배열을 반환하고

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

다음은 반환하지 않습니다.

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

가장 바깥쪽 *의 각 반복이 수량화된 Atom 안에 포함된 모든 캡처 String을 지우기 때문이며, 이 경우 번호 2, 3, 4 및 5의 캡처 String이 포함됩니다.

참고 4

RepeatMatcher의 2.b 단계는 최소 반복 횟수가 충족된 후 빈 문자 시퀀스와 일치하는 Atom의 추가 확장은 이후 반복에서 고려하지 않는다고 명시합니다. 이는 다음과 같은 패턴에서 정규 표현식 엔진이 무한 루프에 빠지는 것을 방지합니다:

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

또는 조금 더 복잡한 다음 패턴:

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

이는 다음 배열을 반환합니다.

["b", ""]

22.2.2.3.2 EmptyMatcher ( )

추상 연산 EmptyMatcher. 인수 없음. 반환값: Matcher. 호출되면 다음 단계를 수행한다.

  1. 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. continue(matchState)를 반환합니다.

22.2.2.3.3 MatchTwoAlternatives ( m1, m2 )

추상 연산 MatchTwoAlternatives. 인수 m1 (Matcher) 및 m2 (Matcher). 반환값: Matcher. 호출되면 다음 단계를 수행한다.

  1. m1과 m2를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. result를 m1(matchState, continue)로 둡니다.
    4. result가 failure가 아니면 result를 반환합니다.
    5. m2(matchState, continue)를 반환합니다.

22.2.2.3.4 MatchSequence ( m1, m2, direction )

추상 연산 MatchSequence. 인수 m1 (Matcher), m2 (Matcher) 및 direction ((forward 또는 backward)). 반환값: Matcher. 호출되면 다음 단계를 수행한다.

  1. direction이 forward이면, 다음을 수행합니다.
    1. m1과 m2를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
      1. 단언: matchState는 MatchState입니다.
      2. 단언: continue는 MatcherContinuation입니다.
      3. d를 continue와 m2를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
        1. 단언: y는 MatchState입니다.
        2. m2(y, continue)를 반환합니다.
      4. m1(matchState, d)를 반환합니다.
  2. 단언: direction은 backward입니다.
  3. m1과 m2를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. d를 continue와 m1을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. m1(y, continue)를 반환합니다.
    4. m2(matchState, d)를 반환합니다.

22.2.2.4 Runtime Semantics: CompileAssertion

구문 지향 연산 CompileAssertion. 인수 regexpRecord (RegExp 레코드). 반환값: Matcher.

참고 1

이 절은 B.1.2.6에서 수정됩니다.

다음 생성 규칙별로 정의된다.

Assertion :: ^
  1. regexpRecord를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. input을 matchState.[[Input]]으로 둡니다.
    4. e를 matchState.[[EndIndex]]로 둡니다.
    5. e = 0이거나, regexpRecord.[[Multiline]]이 true이고 문자 input[e - 1]이 LineTerminator와 일치하면, 다음을 수행합니다.
      1. continue(matchState)를 반환합니다.
    6. failure를 반환합니다.
참고 2

패턴에 y 플래그를 사용하는 경우에도 ^는 항상 input의 시작 또는 (regexpRecord.[[Multiline]]이 true인 경우) 줄의 시작에서만 일치합니다.

Assertion :: $
  1. regexpRecord를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. input을 matchState.[[Input]]으로 둡니다.
    4. e를 matchState.[[EndIndex]]로 둡니다.
    5. inputLength를 input의 요소 수로 둡니다.
    6. e = inputLength이거나, regexpRecord.[[Multiline]]이 true이고 문자 input[e]가 LineTerminator와 일치하면, 다음을 수행합니다.
      1. continue(matchState)를 반환합니다.
    7. failure를 반환합니다.
Assertion :: \b
  1. regexpRecord를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. input을 matchState.[[Input]]으로 둡니다.
    4. e를 matchState.[[EndIndex]]로 둡니다.
    5. a를 IsWordChar(regexpRecord, input, e - 1)로 둡니다.
    6. b를 IsWordChar(regexpRecord, input, e)로 둡니다.
    7. a가 true이고 b가 false이거나, a가 false이고 b가 true이면 continue(matchState)를 반환합니다.
    8. failure를 반환합니다.
Assertion :: \B
  1. regexpRecord를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. input을 matchState.[[Input]]으로 둡니다.
    4. e를 matchState.[[EndIndex]]로 둡니다.
    5. a를 IsWordChar(regexpRecord, input, e - 1)로 둡니다.
    6. b를 IsWordChar(regexpRecord, input, e)로 둡니다.
    7. a가 true이고 b가 true이거나, a가 false이고 b가 false이면 continue(matchState)를 반환합니다.
    8. failure를 반환합니다.
Assertion :: (?= Disjunction )
  1. m을 인수 regexpRecord 및 forward를 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. m을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. d를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. y를 반환합니다.
    4. result를 m(matchState, d)로 둡니다.
    5. result가 failure이면 failure를 반환합니다.
    6. 단언: result는 MatchState입니다.
    7. capability를 result.[[Captures]]로 둡니다.
    8. input을 matchState.[[Input]]으로 둡니다.
    9. xe를 matchState.[[EndIndex]]로 둡니다.
    10. z를 MatchState { [[Input]]: input, [[EndIndex]]: xe, [[Captures]]: capability }로 둡니다.
    11. continue(z)를 반환합니다.
참고 3

(?= Disjunction ) 형식은 너비가 0인 긍정형 전방 탐색을 지정합니다. 성공하려면 Disjunction 안의 패턴이 현재 위치에서 일치해야 하지만, 후속 부분을 일치시키기 전에 현재 위치는 전진하지 않습니다. Disjunction이 현재 위치에서 여러 방식으로 일치할 수 있으면 첫 번째 방식만 시도합니다. 다른 정규 표현식 연산자와 달리 (?= 형식 안으로 백트래킹하지 않습니다(이 비정상적인 동작은 Perl에서 상속됨). 이는 Disjunction에 캡처링 괄호가 포함되고 패턴의 후속 부분에 해당 캡처에 대한 역참조가 포함된 경우에만 중요합니다.

예를 들어,

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

는 첫 번째 b 바로 뒤의 빈 String과 일치하므로 다음 배열을 반환합니다:

["", "aaa"]

전방 탐색 안으로 백트래킹하지 않는다는 점을 보여 주기 위해 다음을 생각해 보시기 바랍니다:

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

이 표현식은 다음을 반환하며

["aba", "a"]

다음은 반환하지 않습니다:

["aaaba", "a"]
Assertion :: (?! Disjunction )
  1. m을 인수 regexpRecord 및 forward를 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. m을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. d를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. y를 반환합니다.
    4. result를 m(matchState, d)로 둡니다.
    5. result가 failure가 아니면 failure를 반환합니다.
    6. continue(matchState)를 반환합니다.
참고 4

(?! Disjunction ) 형식은 너비가 0인 부정형 전방 탐색을 지정합니다. 성공하려면 Disjunction 안의 패턴이 현재 위치에서 일치하지 않아야 합니다. 후속 부분을 일치시키기 전에 현재 위치는 전진하지 않습니다. Disjunction은 캡처링 괄호를 포함할 수 있지만 이에 대한 역참조는 Disjunction 자체 안에서만 의미가 있습니다. 패턴의 다른 위치에서 이러한 캡처링 괄호에 대한 역참조는 항상 undefined를 반환합니다. 패턴이 성공하려면 부정형 전방 탐색이 실패해야 하기 때문입니다. 예를 들어,

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

는 바로 뒤에 양의 수 n개의 a, b, 다시 n개의 a(첫 번째 \2가 지정) 및 c가 이어지지 않는 a를 찾습니다. 두 번째 \2는 부정형 전방 탐색 밖에 있으므로 undefined와 일치하여 항상 성공합니다. 전체 표현식은 다음 배열을 반환합니다:

["baaabaac", "ba", undefined, "abaac"]
Assertion :: (?<= Disjunction )
  1. m을 인수 regexpRecord 및 backward를 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. m을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. d를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. y를 반환합니다.
    4. result를 m(matchState, d)로 둡니다.
    5. result가 failure이면 failure를 반환합니다.
    6. 단언: result는 MatchState입니다.
    7. capability를 result.[[Captures]]로 둡니다.
    8. input을 matchState.[[Input]]으로 둡니다.
    9. xe를 matchState.[[EndIndex]]로 둡니다.
    10. z를 MatchState { [[Input]]: input, [[EndIndex]]: xe, [[Captures]]: capability }로 둡니다.
    11. continue(z)를 반환합니다.
Assertion :: (?<! Disjunction )
  1. m을 인수 regexpRecord 및 backward를 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. m을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (matchState, continue)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: matchState는 MatchState입니다.
    2. 단언: continue는 MatcherContinuation입니다.
    3. d를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. y를 반환합니다.
    4. result를 m(matchState, d)로 둡니다.
    5. result가 failure가 아니면 failure를 반환합니다.
    6. continue(matchState)를 반환합니다.

22.2.2.4.1 IsWordChar ( regexpRecord, input, e )

추상 연산 IsWordChar. 인수 regexpRecord (RegExp 레코드), input (리스트 (요소: 문자)) 및 e (정수). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. inputLength를 input의 요소 수로 둡니다.
  2. e = -1 또는 e = inputLength이면 false를 반환합니다.
  3. char를 문자 input[e]로 둡니다.
  4. WordCharacters(regexpRecord)에 char가 포함되어 있으면 true를 반환합니다.
  5. false를 반환합니다.

22.2.2.5 Runtime Semantics: CompileQuantifier

구문 지향 연산 CompileQuantifier. 인수 없음. 반환값: 레코드 (필드: [[Min]] (음이 아닌 정수), [[Max]] ((음이 아닌 정수 또는 +∞)), [[Greedy]] (Boolean)). 다음 생성 규칙별로 정의된다.

Quantifier :: QuantifierPrefix
  1. qp를 QuantifierPrefix의 CompileQuantifierPrefix로 둡니다.
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: true }를 반환합니다.
Quantifier :: QuantifierPrefix ?
  1. qp를 QuantifierPrefix의 CompileQuantifierPrefix로 둡니다.
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: false }를 반환합니다.

22.2.2.6 Runtime Semantics: CompileQuantifierPrefix

구문 지향 연산 CompileQuantifierPrefix. 인수 없음. 반환값: 레코드 (필드: [[Min]] (음이 아닌 정수), [[Max]] ((음이 아닌 정수 또는 +∞))). 다음 생성 규칙별로 정의된다.

QuantifierPrefix :: *
  1. Record { [[Min]]: 0, [[Max]]: +∞ }를 반환합니다.
QuantifierPrefix :: +
  1. Record { [[Min]]: 1, [[Max]]: +∞ }를 반환합니다.
QuantifierPrefix :: ?
  1. Record { [[Min]]: 0, [[Max]]: 1 }을 반환합니다.
QuantifierPrefix :: { DecimalDigits }
  1. i를 DecimalDigits의 MV로 둡니다(12.9.3 참조).
  2. Record { [[Min]]: i, [[Max]]: i }를 반환합니다.
QuantifierPrefix :: { DecimalDigits ,}
  1. i를 DecimalDigits의 MV로 둡니다.
  2. Record { [[Min]]: i, [[Max]]: +∞ }를 반환합니다.
QuantifierPrefix :: { DecimalDigits , DecimalDigits }
  1. i를 첫 번째 DecimalDigits의 MV로 둡니다.
  2. j를 두 번째 DecimalDigits의 MV로 둡니다.
  3. Record { [[Min]]: i, [[Max]]: j }를 반환합니다.

22.2.2.7 Runtime Semantics: CompileAtom

구문 지향 연산 CompileAtom. 인수 regexpRecord (RegExp 레코드) 및 direction ((forward 또는 backward)). 반환값: Matcher.

참고 1

이 절은 B.1.2.7에서 수정됩니다.

다음 생성 규칙별로 정의된다.

Atom :: PatternCharacter
  1. char를 PatternCharacter와 일치하는 문자로 둡니다.
  2. charSet을 문자 char를 포함하는 한 요소 CharSet으로 둡니다.
  3. CharacterSetMatcher(regexpRecord, charSet, false, direction)를 반환합니다.
Atom :: .
  1. charSet을 AllCharacters(regexpRecord)로 둡니다.
  2. regexpRecord.[[DotAll]]이 true가 아니면, 다음을 수행합니다.
    1. LineTerminator 생성식의 오른쪽에 있는 코드 포인트에 대응하는 모든 문자를 charSet에서 제거합니다.
  3. CharacterSetMatcher(regexpRecord, charSet, false, direction)를 반환합니다.
Atom :: CharacterClass
  1. cc를 인수 regexpRecord를 사용한 CharacterClass의 CompileCharacterClass로 둡니다.
  2. cs를 cc.[[CharSet]]으로 둡니다.
  3. regexpRecord.[[UnicodeSets]]가 false이거나 cs의 모든 CharSetElement가 단일 문자로 구성되어 있으면(cs가 비어 있는 경우 포함) CharacterSetMatcher(regexpRecord, cs, cc.[[Invert]], direction)를 반환합니다.
  4. 단언: cc.[[Invert]]는 false입니다.
  5. listOfMatchers를 Matcher의 빈 List로 둡니다.
  6. csSequences를 새로운 빈 List로 둡니다.
  7. cs의 각 CharSetElement s에 대해 다음을 수행합니다.
    1. s의 길이가 > 1이면 s를 csSequences에 추가합니다.
  8. 각 CharSetElement의 길이에 따라 csSequences를 내림차순으로 정렬합니다.
  9. csSequences의 각 CharSetElement s에 대해 다음을 수행합니다.
    1. 단언: s는 2개 이상의 코드 포인트 시퀀스입니다.
    2. remaining을 s의 코드 포인트로 구성된 List로 둡니다.
    3. cs2를 remaining의 마지막 요소를 포함하는 한 요소 CharSet으로 둡니다.
    4. m2를 CharacterSetMatcher(regexpRecord, cs2, false, direction)로 둡니다.
    5. remaining의 마지막 요소를 제거합니다.
    6. remaining의 각 코드 포인트 c1에 대해 List의 역순으로 다음을 수행합니다.
      1. cs1을 c1을 포함하는 한 요소 CharSet으로 둡니다.
      2. m1을 CharacterSetMatcher(regexpRecord, cs1, false, direction)로 둡니다.
      3. m2를 MatchSequence(m1, m2, direction)로 설정합니다.
    7. m2를 listOfMatchers에 추가합니다.
  10. singles를 단일 문자로 구성된 cs의 모든 CharSetElement를 포함하는 CharSet으로 둡니다.
  11. CharacterSetMatcher(regexpRecord, singles, false, direction)를 listOfMatchers에 추가합니다.
  12. cs에 빈 문자 시퀀스가 포함되어 있으면 EmptyMatcher()를 listOfMatchers에 추가합니다.
  13. m2를 listOfMatchers의 마지막 Matcher로 둡니다.
  14. listOfMatchers의 각 Matcher m1에 대해 끝에서 두 번째 요소부터 역순으로 반복하며 다음을 수행합니다.
    1. m2를 MatchTwoAlternatives(m1, m2)로 설정합니다.
  15. m2를 반환합니다.
Atom :: ( GroupSpecifieropt Disjunction )
  1. m을 인수 regexpRecord 및 direction을 사용한 Disjunction의 CompileSubpattern으로 둡니다.
  2. parenIndex를 CountLeftCapturingParensBefore(Atom)로 둡니다.
  3. direction, m 및 parenIndex를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, c)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: x는 MatchState입니다.
    2. 단언: c는 MatcherContinuation입니다.
    3. d를 x, c, direction 및 parenIndex를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (y)를 갖는 새로운 MatcherContinuation으로 둡니다:
      1. 단언: y는 MatchState입니다.
      2. capability를 y.[[Captures]]의 복사본으로 둡니다.
      3. input을 x.[[Input]]으로 둡니다.
      4. xe를 x.[[EndIndex]]로 둡니다.
      5. ye를 y.[[EndIndex]]로 둡니다.
      6. direction이 forward이면, 다음을 수행합니다.
        1. 단언: xe ≤ ye입니다.
        2. r을 CaptureRange { [[StartIndex]]: xe, [[EndIndex]]: ye }로 둡니다.
      7. 그렇지 않으면,
        1. 단언: direction은 backward입니다.
        2. 단언: ye ≤ xe입니다.
        3. r을 CaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe }로 둡니다.
      8. capability[parenIndex + 1]을 r로 설정합니다.
      9. z를 MatchState { [[Input]]: input, [[EndIndex]]: ye, [[Captures]]: capability }로 둡니다.
      10. c(z)를 반환합니다.
    4. m(x, d)를 반환합니다.
참고 2

( Disjunction ) 형식의 괄호는 Disjunction 패턴의 구성 요소를 함께 그룹화하고 일치 결과를 저장하는 두 역할을 모두 합니다. 결과는 역참조(\ 뒤에 0이 아닌 십진수가 이어짐)에서 사용하거나, replace String에서 참조하거나, 정규 표현식 일치 Abstract Closure가 배열의 일부로 반환할 수 있습니다. 괄호의 캡처 동작을 억제하려면 대신 (?: Disjunction ) 형식을 사용하시기 바랍니다.

Atom :: (? RegularExpressionModifiers : Disjunction )
  1. addModifiers를 RegularExpressionModifiers와 일치하는 소스 텍스트로 둡니다.
  2. removeModifiers를 빈 String으로 둡니다.
  3. modifiedRer를 UpdateModifiers(regexpRecord, CodePointsToString(addModifiers), removeModifiers)로 둡니다.
  4. 인수 modifiedRer 및 direction을 사용한 Disjunction의 CompileSubpattern을 반환합니다.
Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction )
  1. addModifiers를 첫 번째 RegularExpressionModifiers와 일치하는 소스 텍스트로 둡니다.
  2. removeModifiers를 두 번째 RegularExpressionModifiers와 일치하는 소스 텍스트로 둡니다.
  3. modifiedRer를 UpdateModifiers(regexpRecord, CodePointsToString(addModifiers), CodePointsToString(removeModifiers))로 둡니다.
  4. 인수 modifiedRer 및 direction을 사용한 Disjunction의 CompileSubpattern을 반환합니다.
AtomEscape :: DecimalEscape
  1. n을 DecimalEscape의 CapturingGroupNumber로 둡니다.
  2. 단언: n ≤ regexpRecord.[[CapturingGroupsCount]]입니다.
  3. BackreferenceMatcher(regexpRecord, « n », direction)를 반환합니다.
참고 3

\ 뒤에 0이 아닌 십진수 n이 이어지는 형식의 이스케이프 시퀀스는 nth 캡처링 괄호 집합(22.2.2.1)의 결과와 일치합니다. 정규 표현식에 캡처링 괄호가 n개보다 적으면 오류입니다. 정규 표현식에 캡처링 괄호가 n개 이상 있지만 nth 괄호가 아무것도 캡처하지 않아 undefined이면 역참조는 항상 성공합니다.

AtomEscape :: CharacterEscape
  1. charValue를 CharacterEscape의 CharacterValue로 둡니다.
  2. char를 문자 값이 charValue인 문자로 둡니다.
  3. charSet을 문자 char를 포함하는 한 요소 CharSet으로 둡니다.
  4. CharacterSetMatcher(regexpRecord, charSet, false, direction)를 반환합니다.
AtomEscape :: CharacterClassEscape
  1. cs를 인수 regexpRecord를 사용한 CharacterClassEscape의 CompileToCharSet으로 둡니다.
  2. regexpRecord.[[UnicodeSets]]가 false이거나 cs의 모든 CharSetElement가 단일 문자로 구성되어 있으면(cs가 비어 있는 경우 포함) CharacterSetMatcher(regexpRecord, cs, false, direction)를 반환합니다.
  3. listOfMatchers를 Matcher의 빈 List로 둡니다.
  4. csSequences를 새로운 빈 List로 둡니다.
  5. cs의 각 CharSetElement s에 대해 다음을 수행합니다.
    1. s의 길이가 > 1이면 s를 csSequences에 추가합니다.
  6. 각 CharSetElement의 길이에 따라 csSequences를 내림차순으로 정렬합니다.
  7. csSequences의 각 CharSetElement s에 대해 다음을 수행합니다.
    1. 단언: s는 2개 이상의 코드 포인트 시퀀스입니다.
    2. remaining을 s의 코드 포인트로 구성된 List로 둡니다.
    3. cs2를 remaining의 마지막 요소를 포함하는 한 요소 CharSet으로 둡니다.
    4. m2를 CharacterSetMatcher(regexpRecord, cs2, false, direction)로 둡니다.
    5. remaining의 마지막 요소를 제거합니다.
    6. remaining의 각 코드 포인트 c1에 대해 List의 역순으로 다음을 수행합니다.
      1. cs1을 c1을 포함하는 한 요소 CharSet으로 둡니다.
      2. m1을 CharacterSetMatcher(regexpRecord, cs1, false, direction)로 둡니다.
      3. m2를 MatchSequence(m1, m2, direction)로 설정합니다.
    7. m2를 listOfMatchers에 추가합니다.
  8. singles를 단일 문자로 구성된 cs의 모든 CharSetElement를 포함하는 CharSet으로 둡니다.
  9. CharacterSetMatcher(regexpRecord, singles, false, direction)를 listOfMatchers에 추가합니다.
  10. cs에 빈 문자 시퀀스가 포함되어 있으면 EmptyMatcher()를 listOfMatchers에 추가합니다.
  11. m2를 listOfMatchers의 마지막 Matcher로 둡니다.
  12. listOfMatchers의 각 Matcher m1에 대해 끝에서 두 번째 요소부터 역순으로 반복하며 다음을 수행합니다.
    1. m2를 MatchTwoAlternatives(m1, m2)로 설정합니다.
  13. m2를 반환합니다.
AtomEscape :: k GroupName
  1. matchingGroupSpecifiers를 GroupSpecifiersThatMatch(GroupName)로 둡니다.
  2. parenIndices를 새로운 빈 List로 둡니다.
  3. matchingGroupSpecifiers의 각 GroupSpecifier groupSpecifier에 대해 다음을 수행합니다.
    1. parenIndex를 CountLeftCapturingParensBefore(groupSpecifier)로 둡니다.
    2. parenIndex를 parenIndices에 추가합니다.
  4. BackreferenceMatcher(regexpRecord, parenIndices, direction)를 반환합니다.

22.2.2.7.1 CharacterSetMatcher ( regexpRecord, charSet, invert, direction )

추상 연산 CharacterSetMatcher. 인수 regexpRecord (RegExp 레코드), charSet (CharSet), invert (Boolean) 및 direction ((forward 또는 backward)). 반환값: Matcher. 호출되면 다음 단계를 수행한다.

  1. regexpRecord.[[UnicodeSets]]가 true이면, 다음을 수행합니다.
    1. 단언: invert는 false입니다.
    2. 단언: charSet의 모든 CharSetElement는 단일 문자로 구성됩니다.
  2. regexpRecord, charSet, invert 및 direction을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, c)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: x는 MatchState입니다.
    2. 단언: c는 MatcherContinuation입니다.
    3. input을 x.[[Input]]으로 둡니다.
    4. endIndex를 x.[[EndIndex]]로 둡니다.
    5. direction이 forward이면 f를 endIndex + 1로 둡니다.
    6. 그렇지 않으면 f를 endIndex - 1로 둡니다.
    7. inputLength를 input의 요소 수로 둡니다.
    8. f < 0 또는 f > inputLength이면 failure를 반환합니다.
    9. index를 min(endIndex, f)로 둡니다.
    10. char를 문자 input[index]로 둡니다.
    11. cc를 Canonicalize(regexpRecord, char)로 둡니다.
    12. charSet에 정확히 하나의 문자 a를 포함하며 Canonicalize(regexpRecord, a)가 cc인 CharSetElement가 존재하면 found를 true로 둡니다. 그렇지 않으면 found를 false로 둡니다.
    13. invert가 false이고 found가 false이면 failure를 반환합니다.
    14. invert가 true이고 found가 true이면 failure를 반환합니다.
    15. capability를 x.[[Captures]]로 둡니다.
    16. y를 MatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: capability }로 둡니다.
    17. c(y)를 반환합니다.

22.2.2.7.2 BackreferenceMatcher ( regexpRecord, ns, direction )

추상 연산 BackreferenceMatcher. 인수 regexpRecord (RegExp 레코드), ns (리스트 (요소: 양의 정수)) 및 direction ((forward 또는 backward)). 반환값: Matcher. 호출되면 다음 단계를 수행한다.

  1. regexpRecord, ns 및 direction을 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, c)를 갖는 새로운 Matcher를 반환합니다:
    1. 단언: x는 MatchState입니다.
    2. 단언: c는 MatcherContinuation입니다.
    3. input을 x.[[Input]]으로 둡니다.
    4. capability를 x.[[Captures]]로 둡니다.
    5. r을 undefined로 둡니다.
    6. ns의 각 정수 n에 대해 다음을 수행합니다.
      1. capability[n]이 undefined가 아니면, 다음을 수행합니다.
        1. 단언: r은 undefined입니다.
        2. r을 capability[n]으로 설정합니다.
    7. r이 undefined이면 c(x)를 반환합니다.
    8. endIndex를 x.[[EndIndex]]로 둡니다.
    9. rs를 r.[[StartIndex]]로 둡니다.
    10. re를 r.[[EndIndex]]로 둡니다.
    11. length를 re - rs로 둡니다.
    12. direction이 forward이면 f를 endIndex + length로 둡니다.
    13. 그렇지 않으면 f를 endIndex - length로 둡니다.
    14. inputLength를 input의 요소 수로 둡니다.
    15. f < 0 또는 f > inputLength이면 failure를 반환합니다.
    16. g를 min(endIndex, f)로 둡니다.
    17. 0(포함)부터 length(제외)까지의 구간에 속하는 어떤 정수 i에 대해 Canonicalize(regexpRecord, input[rs + i])가 Canonicalize(regexpRecord, input[g + i])가 아니면 failure를 반환합니다.
    18. y를 MatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: capability }로 둡니다.
    19. c(y)를 반환합니다.

22.2.2.7.3 Canonicalize ( regexpRecord, char )

추상 연산 Canonicalize. 인수 regexpRecord (RegExp 레코드) 및 char (문자). 반환값: 문자. 호출되면 다음 단계를 수행한다.

  1. HasEitherUnicodeFlag(regexpRecord)이 true이고 regexpRecord.[[IgnoreCase]]가 true이면, 다음을 수행합니다.
    1. Unicode Character Database의 CaseFolding.txt 파일이 char에 대한 단순 또는 공통 대소문자 폴딩 매핑을 제공하면 해당 매핑을 char에 적용한 결과를 반환합니다.
    2. char를 반환합니다.
  2. regexpRecord.[[IgnoreCase]]가 false이면 char를 반환합니다.
  3. 단언: char는 UTF-16 코드 단위입니다.
  4. codePoint를 숫자 값이 char의 숫자 값인 코드 포인트로 둡니다.
  5. mappedCodePoints를 Unicode Default Case Conversion 알고리즘에 따라 toUppercase(« codePoint »)로 둡니다.
  6. CodePointsToString(mappedCodePoints)의 길이 ≠ 1이면 char를 반환합니다.
  7. 단언: mappedCodePoints의 요소 수는 1입니다.
  8. mappedCodePoint를 mappedCodePoints의 유일한 코드 포인트 요소로 둡니다.
  9. char의 숫자 값 ≥ 128이고 mappedCodePoint의 숫자 값 < 128이면 char를 반환합니다.
  10. 숫자 값이 mappedCodePoint의 숫자 값인 코드 단위를 반환합니다.
참고

HasEitherUnicodeFlag(regexpRecord)이 true인 대소문자 비구분 일치에서는 모든 문자를 비교하기 직전에 유니코드 표준이 제공하는 단순 매핑을 사용하여 암묵적으로 대소문자 폴딩합니다. 단순 매핑은 항상 하나의 코드 포인트로 매핑하므로 예를 들어 ß (U+00DF LATIN SMALL LETTER SHARP S)를 ss 또는 SS로 매핑하지 않습니다. 그러나 Basic Latin 블록 밖의 코드 포인트를 그 안의 코드 포인트로 매핑할 수 있습니다. 예를 들어 ſ (U+017F LATIN SMALL LETTER LONG S)는 s (U+0073 LATIN SMALL LETTER S)로 대소문자 폴딩되고 K (U+212A KELVIN SIGN)는 k (U+006B LATIN SMALL LETTER K)로 대소문자 폴딩됩니다. 이러한 코드 포인트를 포함하는 String은 /[a-z]/ui와 같은 정규 표현식과 일치합니다.

HasEitherUnicodeFlag(regexpRecord)이 false인 대소문자 비구분 일치에서는 매핑이 toCasefold가 아니라 Unicode Default Case Conversion 알고리즘의 toUppercase를 기반으로 하므로 미묘한 차이가 생깁니다. 예를 들어 Ω (U+2126 OHM SIGN)는 toUppercase에서 자기 자신으로 매핑되지만 toCasefold에서는 Ω (U+03A9 GREEK CAPITAL LETTER OMEGA)와 함께 ω (U+03C9 GREEK SMALL LETTER OMEGA)로 매핑되므로 "\u2126"은 /[ω]/ui 및 /[\u03A9]/ui와 일치하지만 /[ω]/i 또는 /[\u03A9]/i와는 일치하지 않습니다. 또한 Basic Latin 블록 밖의 어떤 코드 포인트도 그 안의 코드 포인트로 매핑되지 않으므로 "\u017F ſ" 및 "\u212A K"와 같은 String은 /[a-z]/i와 일치하지 않습니다.

22.2.2.7.4 UpdateModifiers ( regexpRecord, add, remove )

추상 연산 UpdateModifiers. 인수 regexpRecord (RegExp 레코드), add (String) 및 remove (String). 반환값: RegExp 레코드. 호출되면 다음 단계를 수행한다.

  1. 단언: add와 remove는 공통 요소를 갖지 않습니다.
  2. ignoreCase를 regexpRecord.[[IgnoreCase]]로 둡니다.
  3. multiline을 regexpRecord.[[Multiline]]으로 둡니다.
  4. dotAll을 regexpRecord.[[DotAll]]로 둡니다.
  5. unicode를 regexpRecord.[[Unicode]]로 둡니다.
  6. unicodeSets를 regexpRecord.[[UnicodeSets]]로 둡니다.
  7. capturingGroupsCount를 regexpRecord.[[CapturingGroupsCount]]로 둡니다.
  8. remove에 "i"가 포함되어 있으면 ignoreCase를 false로 설정합니다.
  9. 그렇지 않고 add에 "i"가 포함되어 있으면 ignoreCase를 true로 설정합니다.
  10. remove에 "m"이 포함되어 있으면 multiline을 false로 설정합니다.
  11. 그렇지 않고 add에 "m"이 포함되어 있으면 multiline을 true로 설정합니다.
  12. remove에 "s"가 포함되어 있으면 dotAll을 false로 설정합니다.
  13. 그렇지 않고 add에 "s"가 포함되어 있으면 dotAll을 true로 설정합니다.
  14. RegExp Record { [[IgnoreCase]]: ignoreCase, [[Multiline]]: multiline, [[DotAll]]: dotAll, [[Unicode]]: unicode, [[UnicodeSets]]: unicodeSets, [[CapturingGroupsCount]]: capturingGroupsCount }를 반환합니다.

22.2.2.8 Runtime Semantics: CompileCharacterClass

구문 지향 연산 CompileCharacterClass. 인수 regexpRecord (RegExp 레코드). 반환값: 레코드 (필드: [[CharSet]] (CharSet), [[Invert]] (Boolean)). 다음 생성 규칙별로 정의된다.

CharacterClass :: [ ClassContents ]
  1. charSet을 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet으로 둡니다.
  2. Record { [[CharSet]]: charSet, [[Invert]]: false }를 반환합니다.
CharacterClass :: [^ ClassContents ]
  1. charSet을 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet으로 둡니다.
  2. regexpRecord.[[UnicodeSets]]가 true이면, 다음을 수행합니다.
    1. Record { [[CharSet]]: CharacterComplement(regexpRecord, charSet), [[Invert]]: false }를 반환합니다.
  3. Record { [[CharSet]]: charSet, [[Invert]]: true }를 반환합니다.

22.2.2.9 Runtime Semantics: CompileToCharSet

구문 지향 연산 CompileToCharSet. 인수 regexpRecord (RegExp 레코드). 반환값: CharSet.

참고 1

이 절은 B.1.2.8에서 수정됩니다.

다음 생성 규칙별로 정의된다.

ClassContents :: [empty]
  1. 빈 CharSet을 반환합니다.
NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash
  1. charSet을 인수 regexpRecord를 사용한 ClassAtom의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 NonemptyClassRangesNoDash의 CompileToCharSet으로 둡니다.
  3. CharSet charSet과 otherSet의 합집합을 반환합니다.
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. charSet을 인수 regexpRecord를 사용한 첫 번째 ClassAtom의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 두 번째 ClassAtom의 CompileToCharSet으로 둡니다.
  3. remainingSet을 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet으로 둡니다.
  4. rangeSet을 CharacterRange(charSet, otherSet)로 둡니다.
  5. rangeSet과 remainingSet의 합집합을 반환합니다.
NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash
  1. charSet을 인수 regexpRecord를 사용한 ClassAtomNoDash의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 NonemptyClassRangesNoDash의 CompileToCharSet으로 둡니다.
  3. CharSet charSet과 otherSet의 합집합을 반환합니다.
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. charSet을 인수 regexpRecord를 사용한 ClassAtomNoDash의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 ClassAtom의 CompileToCharSet으로 둡니다.
  3. remainingSet을 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet으로 둡니다.
  4. rangeSet을 CharacterRange(charSet, otherSet)로 둡니다.
  5. rangeSet과 remainingSet의 합집합을 반환합니다.
참고 2

ClassContents는 단일 ClassAtom 및/또는 하이픈으로 구분된 두 ClassAtom의 범위로 전개될 수 있습니다. 후자의 경우 ClassContents에는 첫 번째 ClassAtom과 두 번째 ClassAtom 사이의 모든 문자가 양 끝을 포함하여 들어갑니다. 어느 ClassAtom이든 단일 문자를 나타내지 않거나(예: 하나가 \w인 경우), 첫 번째 ClassAtom의 문자 값이 두 번째 ClassAtom의 문자 값보다 엄격하게 크면 오류가 발생합니다.

참고 3

패턴이 대소문자를 무시하더라도 범위의 양 끝에서 대소문자는 어떤 문자가 범위에 속하는지 결정할 때 중요합니다. 따라서 예를 들어 패턴 /[E-F]/i는 문자 E, F, e, f에만 일치하지만, 패턴 /[E-f]/i는 유니코드 Basic Latin 블록의 모든 대문자와 소문자뿐만 아니라 기호 [, \, ], ^, _ 및 `에도 일치합니다.

참고 4

- 문자는 리터럴로 취급할 수도 있고 범위를 나타낼 수도 있습니다. ClassContents의 첫 번째 또는 마지막 문자이거나, 범위 지정의 시작 또는 끝 경계이거나, 범위 지정 바로 뒤에 오는 경우 리터럴로 취급합니다.

ClassAtom :: -
  1. 단일 문자 - U+002D (HYPHEN-MINUS)를 포함하는 CharSet을 반환합니다.
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. SourceCharacter와 일치하는 문자를 포함하는 CharSet을 반환합니다.
ClassEscape :: b - CharacterEscape
  1. charValue를 이 ClassEscape의 CharacterValue로 둡니다.
  2. char를 문자 값이 charValue인 문자로 둡니다.
  3. 단일 문자 char를 포함하는 CharSet을 반환합니다.
참고 5

ClassAtom은 \b, \B 및 역참조를 제외하고 정규 표현식의 나머지 부분에서 허용되는 모든 이스케이프 시퀀스를 사용할 수 있습니다. CharacterClass 안에서 \b는 백스페이스 문자를 의미하지만 \B와 역참조는 오류를 발생시킵니다. ClassAtom 안에서 역참조를 사용하면 오류가 발생합니다.

CharacterClassEscape :: d
  1. 문자 0, 1, 2, 3, 4, 5, 6, 7, 8, 9를 포함하는 10요소 CharSet을 반환합니다.
CharacterClassEscape :: D
  1. charSet을 CharacterClassEscape :: d 가 반환한 CharSet으로 둡니다.
  2. CharacterComplement(regexpRecord, charSet)를 반환합니다.
CharacterClassEscape :: s
  1. WhiteSpace 또는 LineTerminator 생성식의 오른쪽에 있는 코드 포인트에 대응하는 모든 문자를 포함하는 CharSet을 반환합니다.
CharacterClassEscape :: S
  1. charSet을 CharacterClassEscape :: s 가 반환한 CharSet으로 둡니다.
  2. CharacterComplement(regexpRecord, charSet)를 반환합니다.
CharacterClassEscape :: w
  1. MaybeSimpleCaseFolding(regexpRecord, WordCharacters(regexpRecord))을 반환합니다.
CharacterClassEscape :: W
  1. charSet을 CharacterClassEscape :: w 가 반환한 CharSet으로 둡니다.
  2. CharacterComplement(regexpRecord, charSet)를 반환합니다.
CharacterClassEscape :: p{ UnicodePropertyValueExpression }
  1. 인수 regexpRecord를 사용한 UnicodePropertyValueExpression의 CompileToCharSet을 반환합니다.
CharacterClassEscape :: P{ UnicodePropertyValueExpression }
  1. charSet을 인수 regexpRecord를 사용한 UnicodePropertyValueExpression의 CompileToCharSet으로 둡니다.
  2. 단언: charSet은 단일 코드 포인트만 포함합니다.
  3. CharacterComplement(regexpRecord, charSet)를 반환합니다.
UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue
  1. ps를 UnicodePropertyName과 일치하는 소스 텍스트로 둡니다.
  2. p를 UnicodeMatchProperty(regexpRecord, ps)로 둡니다.
  3. 단언: p는 표 65의 “Property name and aliases” 열에 나열된 Unicode property name 또는 프로퍼티 별칭입니다.
  4. vs를 UnicodePropertyValue와 일치하는 소스 텍스트로 둡니다.
  5. v를 UnicodeMatchPropertyValue(p, vs)로 둡니다.
  6. charSet을 문자 데이터베이스 정의에 값 v를 갖는 프로퍼티 p가 포함된 모든 유니코드 코드 포인트를 포함하는 CharSet으로 둡니다.
  7. MaybeSimpleCaseFolding(regexpRecord, charSet)을 반환합니다.
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. s를 LoneUnicodePropertyNameOrValue과 일치하는 소스 텍스트로 둡니다.
  2. UnicodeMatchPropertyValue(General_Category, s)가 PropertyValueAliases.txt에 나열된 General_Category (gc) 프로퍼티의 유니코드 프로퍼티 값 또는 프로퍼티 값 별칭이면, 다음을 수행합니다.
    1. 문자 데이터베이스 정의에 값 s를 갖는 프로퍼티 “General_Category”가 포함된 모든 유니코드 코드 포인트를 포함하는 CharSet을 반환합니다.
  3. p를 UnicodeMatchProperty(regexpRecord, s)로 둡니다.
  4. 단언: p는 표 66의 “Property name and aliases” 열에 나열된 이진 유니코드 프로퍼티 또는 이진 프로퍼티 별칭이거나, 표 67의 “Property name” 열에 나열된 문자열의 이진 유니코드 프로퍼티입니다.
  5. charSet을 문자 데이터베이스 정의에 값 “True”를 갖는 프로퍼티 p가 포함된 모든 CharSetElement를 포함하는 CharSet으로 둡니다.
  6. MaybeSimpleCaseFolding(regexpRecord, charSet)을 반환합니다.
ClassUnion :: ClassSetRange ClassUnionopt
  1. charSet을 인수 regexpRecord를 사용한 ClassSetRange의 CompileToCharSet으로 둡니다.
  2. ClassUnion이 존재하면, 다음을 수행합니다.
    1. otherSet을 인수 regexpRecord를 사용한 ClassUnion의 CompileToCharSet으로 둡니다.
    2. CharSet charSet과 otherSet의 합집합을 반환합니다.
  3. charSet을 반환합니다.
ClassUnion :: ClassSetOperand ClassUnionopt
  1. charSet을 인수 regexpRecord를 사용한 ClassSetOperand의 CompileToCharSet으로 둡니다.
  2. ClassUnion이 존재하면, 다음을 수행합니다.
    1. otherSet을 인수 regexpRecord를 사용한 ClassUnion의 CompileToCharSet으로 둡니다.
    2. CharSet charSet과 otherSet의 합집합을 반환합니다.
  3. charSet을 반환합니다.
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. charSet을 인수 regexpRecord를 사용한 첫 번째 ClassSetOperand의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 두 번째 ClassSetOperand의 CompileToCharSet으로 둡니다.
  3. CharSet charSet과 otherSet의 교집합을 반환합니다.
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. charSet을 인수 regexpRecord를 사용한 ClassIntersection의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 ClassSetOperand의 CompileToCharSet으로 둡니다.
  3. CharSet charSet과 otherSet의 교집합을 반환합니다.
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. charSet을 인수 regexpRecord를 사용한 첫 번째 ClassSetOperand의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 두 번째 ClassSetOperand의 CompileToCharSet으로 둡니다.
  3. otherSet의 CharSetElement이기도 한 요소를 제외한 charSet의 CharSetElement를 포함하는 CharSet을 반환합니다.
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. charSet을 인수 regexpRecord를 사용한 ClassSubtraction의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 ClassSetOperand의 CompileToCharSet으로 둡니다.
  3. otherSet의 CharSetElement이기도 한 요소를 제외한 charSet의 CharSetElement를 포함하는 CharSet을 반환합니다.
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  1. charSet을 인수 regexpRecord를 사용한 첫 번째 ClassSetCharacter의 CompileToCharSet으로 둡니다.
  2. otherSet을 인수 regexpRecord를 사용한 두 번째 ClassSetCharacter의 CompileToCharSet으로 둡니다.
  3. MaybeSimpleCaseFolding(regexpRecord, CharacterRange(charSet, otherSet))을 반환합니다.
참고 6

결과는 흔히 둘 이상의 범위로 구성됩니다. UnicodeSets가 true이고 IgnoreCase가 true이면 MaybeSimpleCaseFolding(regexpRecord, [Ā-č])에는 해당 범위의 홀수 번호 코드 포인트만 포함됩니다.

ClassSetOperand :: ClassSetCharacter
  1. charSet을 인수 regexpRecord를 사용한 ClassSetCharacter의 CompileToCharSet으로 둡니다.
  2. MaybeSimpleCaseFolding(regexpRecord, charSet)을 반환합니다.
ClassSetOperand :: ClassStringDisjunction
  1. charSet을 인수 regexpRecord를 사용한 ClassStringDisjunction의 CompileToCharSet으로 둡니다.
  2. MaybeSimpleCaseFolding(regexpRecord, charSet)을 반환합니다.
ClassSetOperand :: NestedClass
  1. 인수 regexpRecord를 사용한 NestedClass의 CompileToCharSet을 반환합니다.
NestedClass :: [ ClassContents ]
  1. 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet을 반환합니다.
NestedClass :: [^ ClassContents ]
  1. charSet을 인수 regexpRecord를 사용한 ClassContents의 CompileToCharSet으로 둡니다.
  2. CharacterComplement(regexpRecord, charSet)를 반환합니다.
NestedClass :: \ CharacterClassEscape
  1. 인수 regexpRecord를 사용한 CharacterClassEscape의 CompileToCharSet을 반환합니다.
ClassStringDisjunction :: \q{ ClassStringDisjunctionContents }
  1. 인수 regexpRecord를 사용한 ClassStringDisjunctionContents의 CompileToCharSet을 반환합니다.
ClassStringDisjunctionContents :: ClassString
  1. s를 인수 regexpRecord를 사용한 ClassString의 CompileClassSetString으로 둡니다.
  2. 하나의 문자열 s를 포함하는 CharSet을 반환합니다.
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. s를 인수 regexpRecord를 사용한 ClassString의 CompileClassSetString으로 둡니다.
  2. charSet을 하나의 문자열 s를 포함하는 CharSet으로 둡니다.
  3. otherSet을 인수 regexpRecord를 사용한 ClassStringDisjunctionContents의 CompileToCharSet으로 둡니다.
  4. CharSet charSet과 otherSet의 합집합을 반환합니다.
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape \ ClassSetReservedPunctuator
  1. charValue를 이 ClassSetCharacter의 CharacterValue로 둡니다.
  2. char를 문자 값이 charValue인 문자로 둡니다.
  3. 단일 문자 char를 포함하는 CharSet을 반환합니다.
ClassSetCharacter :: \b
  1. 단일 문자 U+0008 (BACKSPACE)을 포함하는 CharSet을 반환합니다.

22.2.2.9.1 CharacterRange ( charSet, otherSet )

추상 연산 CharacterRange. 인수 charSet (CharSet) 및 otherSet (CharSet). 반환값: CharSet. 호출되면 다음 단계를 수행한다.

  1. 단언: charSet과 otherSet은 각각 정확히 하나의 문자를 포함합니다.
  2. a를 CharSet charSet의 유일한 문자로 둡니다.
  3. b를 CharSet otherSet의 유일한 문자로 둡니다.
  4. i를 문자 a의 문자 값으로 둡니다.
  5. j를 문자 b의 문자 값으로 둡니다.
  6. 단언: i ≤ j입니다.
  7. i부터 j까지의 폐구간에 속하는 문자 값을 갖는 모든 문자를 포함하는 CharSet을 반환합니다.

22.2.2.9.2 HasEitherUnicodeFlag ( regexpRecord )

추상 연산 HasEitherUnicodeFlag. 인수 regexpRecord (RegExp 레코드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. regexpRecord.[[Unicode]]가 true이거나 regexpRecord.[[UnicodeSets]]가 true이면 true를 반환합니다.
  2. false를 반환합니다.

22.2.2.9.3 WordCharacters ( regexpRecord )

추상 연산 WordCharacters. 인수 regexpRecord (RegExp 레코드). 반환값: CharSet. \b, \B, \w 및 \W의 목적상 “단어 문자”로 간주되는 문자를 포함하는 CharSet을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. basicWordChars를 ASCII 단어 문자에 속하는 모든 문자를 포함하는 CharSet으로 둡니다.
  2. extraWordChars를 basicWordChars에 속하지 않지만 Canonicalize(regexpRecord, c)가 basicWordChars에 속하는 모든 문자 c를 포함하는 CharSet으로 둡니다.
  3. 단언: HasEitherUnicodeFlag(regexpRecord)이 true이고 regexpRecord.[[IgnoreCase]]가 true인 경우를 제외하면 extraWordChars는 비어 있습니다.
  4. basicWordChars와 extraWordChars의 합집합을 반환합니다.

22.2.2.9.4 AllCharacters ( regexpRecord )

추상 연산 AllCharacters. 인수 regexpRecord (RegExp 레코드). 반환값: CharSet. 정규 표현식 플래그에 따라 “모든 문자”의 집합을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. regexpRecord.[[UnicodeSets]]가 true이고 regexpRecord.[[IgnoreCase]]가 true이면, 다음을 수행합니다.
    1. Simple Case Folding 매핑이 없는 모든 유니코드 코드 포인트 c(즉, scf(c)=c)를 포함하는 CharSet을 반환합니다.
  2. HasEitherUnicodeFlag(regexpRecord)이 true이면, 다음을 수행합니다.
    1. 모든 코드 포인트 값을 포함하는 CharSet을 반환합니다.
  3. 모든 코드 단위 값을 포함하는 CharSet을 반환합니다.

22.2.2.9.5 MaybeSimpleCaseFolding ( regexpRecord, charSet )

추상 연산 MaybeSimpleCaseFolding. 인수 regexpRecord (RegExp 레코드) 및 charSet (CharSet). 반환값: CharSet. regexpRecord.[[UnicodeSets]]가 false이거나 regexpRecord.[[IgnoreCase]]가 false이면 charSet을 반환합니다. 그렇지 않으면 Unicode Character Database의 CaseFolding.txt 파일에 있는 Simple Case Folding (scf(codePoint)) 정의(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑함)를 사용하여 charSet의 각 CharSetElement를 문자별로 정규 형식으로 매핑하고 결과 CharSet을 반환합니다. 호출되면 다음 단계를 수행한다.

  1. regexpRecord.[[UnicodeSets]]가 false이거나 regexpRecord.[[IgnoreCase]]가 false이면 charSet을 반환합니다.
  2. otherSet을 새로운 빈 CharSet으로 둡니다.
  3. charSet의 각 CharSetElement s에 대해 다음을 수행합니다.
    1. t를 빈 문자 시퀀스로 둡니다.
    2. s의 각 단일 코드 포인트 codePoint에 대해 다음을 수행합니다.
      1. scf(codePoint)를 t에 추가합니다.
    3. t를 otherSet에 추가합니다.
  4. otherSet을 반환합니다.

22.2.2.9.6 CharacterComplement ( regexpRecord, complement )

추상 연산 CharacterComplement. 인수 regexpRecord (RegExp 레코드) 및 complement (CharSet). 반환값: CharSet. 호출되면 다음 단계를 수행한다.

  1. charSet을 AllCharacters(regexpRecord)로 둡니다.
  2. complement의 CharSetElement이기도 한 요소를 제외한 charSet의 CharSetElement를 포함하는 CharSet을 반환합니다.

22.2.2.9.7 UnicodeMatchProperty ( regexpRecord, p )

추상 연산 UnicodeMatchProperty. 인수 regexpRecord (RegExp 레코드) 및 p (ECMAScript 소스 텍스트). 반환값: a Unicode property name. 호출되면 다음 단계를 수행한다.

  1. regexpRecord.[[UnicodeSets]]가 true이고 p가 표 67의 “Property name” 열에 나열된 Unicode property name이면, 다음을 수행합니다.
    1. 유니코드 코드 포인트의 List p를 반환합니다.
  2. 단언: p는 표 65 또는 표 66의 “Property name and aliases” 열에 나열된 Unicode property name 또는 프로퍼티 별칭입니다.
  3. c를 해당 행의 “Canonical property name” 열에 제시된 p의 정규 property name으로 둡니다.
  4. 유니코드 코드 포인트의 List c를 반환합니다.

구현체는 표 65, 표 66 및 표 67에 나열된 Unicode property name과 별칭을 지원해야 합니다. 상호 운용성을 보장하기 위해 구현체는 다른 어떤 property name이나 별칭도 지원해서는 안 됩니다.

참고 1

예를 들어 Script_Extensions(property name)와 scx(프로퍼티 별칭)는 유효하지만 script_extensions 또는 Scx는 유효하지 않습니다.

참고 2

나열된 프로퍼티는 UTS18 RL1.2가 요구하는 것의 상위 집합을 구성합니다.

참고 3

이 표의 항목 철자(대소문자 포함)는 Unicode Character Database의 PropertyAliases.txt 파일에서 사용하는 철자와 일치합니다. 해당 파일의 정확한 철자는 안정적으로 유지됨이 보장됩니다.

표 65: 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
표 66: 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
표 67: 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 )

추상 연산 UnicodeMatchPropertyValue. 인수 p (ECMAScript 소스 텍스트) 및 v (ECMAScript 소스 텍스트). 반환값: a Unicode property value. 호출되면 다음 단계를 수행한다.

  1. 단언: p는 표 65의 “Canonical property name” 열에 나열된 정규이며 별칭이 아닌 Unicode property name입니다.
  2. 단언: v는 PropertyValueAliases.txt에 나열된 유니코드 프로퍼티 p의 프로퍼티 값 또는 프로퍼티 값 별칭입니다.
  3. value를 해당 행의 “Canonical property value” 열에 제시된 v의 정규 프로퍼티 값으로 둡니다.
  4. 유니코드 코드 포인트의 List value를 반환합니다.

구현체는 표 65에 나열된 프로퍼티에 대해 PropertyValueAliases.txt에 나열된 유니코드 프로퍼티 값 및 프로퍼티 값 별칭을 지원해야 합니다. 상호 운용성을 보장하기 위해 구현체는 다른 프로퍼티 값이나 프로퍼티 값 별칭을 지원해서는 안 됩니다.

참고 1

예를 들어 Xpeo와 Old_Persian은 유효한 Script_Extensions 값이지만 xpeo와 Old Persian은 유효하지 않습니다.

참고 2

이 알고리즘은 UAX44에 나열된 기호 값의 일치 규칙과 다릅니다. 대소문자, 공백, U+002D (HYPHEN-MINUS) 및 U+005F (LOW LINE)는 무시되지 않으며 Is 접두사는 지원되지 않습니다.

22.2.2.10 Runtime Semantics: CompileClassSetString

구문 지향 연산 CompileClassSetString. 인수 regexpRecord (RegExp 레코드). 반환값: a sequence of characters. 다음 생성 규칙별로 정의된다.

ClassString :: [empty]
  1. 빈 문자 시퀀스를 반환합니다.
ClassString :: NonEmptyClassString
  1. 인수 regexpRecord를 사용한 NonEmptyClassString의 CompileClassSetString을 반환합니다.
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. cs를 인수 regexpRecord를 사용한 ClassSetCharacter의 CompileToCharSet으로 둡니다.
  2. s1을 cs의 유일한 CharSetElement인 문자 시퀀스로 둡니다.
  3. NonEmptyClassString이 존재하면, 다음을 수행합니다.
    1. s2를 인수 regexpRecord를 사용한 NonEmptyClassString의 CompileClassSetString으로 둡니다.
    2. s1과 s2의 연결을 반환합니다.
  4. s1을 반환합니다.

22.2.3 RegExp 생성을 위한 추상 연산

22.2.3.1 RegExpCreate ( pattern, flags )

추상 연산 RegExpCreate. 인수 pattern (ECMAScript 언어 값) 및 flags ((String 또는 undefined)). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. obj를 ! RegExpAlloc(%RegExp%)로 둡니다.
  2. ? RegExpInitialize(obj, pattern, flags)를 반환합니다.

22.2.3.2 RegExpAlloc ( newTarget )

추상 연산 RegExpAlloc. 인수 newTarget (생성자). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  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 )

추상 연산 RegExpInitialize. 인수 obj (Object), pattern (ECMAScript 언어 값) 및 flags (ECMAScript 언어 값). 반환값: (정상 완료 (값: Object) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. pattern이 undefined이면 pattern을 빈 String으로 설정합니다.
  2. 그렇지 않으면 pattern을 ? ToString(pattern)으로 설정합니다.
  3. flags가 undefined이면 flags를 빈 String으로 설정합니다.
  4. 그렇지 않으면 flags를 ? ToString(flags)으로 설정합니다.
  5. flags에 "d", "g", "i", "m", "s", "u", "v" 또는 "y" 이외의 코드 단위가 포함되어 있으면 SyntaxError 예외를 던집니다.
  6. flags에 어떤 코드 단위가 두 번 이상 포함되어 있으면 SyntaxError 예외를 던집니다.
  7. flags에 "i"가 포함되어 있으면 i를 true로 둡니다. 그렇지 않으면 i를 false로 둡니다.
  8. flags에 "m"이 포함되어 있으면 m을 true로 둡니다. 그렇지 않으면 m을 false로 둡니다.
  9. flags에 "s"가 포함되어 있으면 s를 true로 둡니다. 그렇지 않으면 s를 false로 둡니다.
  10. flags에 "u"가 포함되어 있으면 u를 true로 둡니다. 그렇지 않으면 u를 false로 둡니다.
  11. flags에 "v"가 포함되어 있으면 v를 true로 둡니다. 그렇지 않으면 v를 false로 둡니다.
  12. u가 true이거나 v가 true이면, 다음을 수행합니다.
    1. patternText를 StringToCodePoints(pattern)로 둡니다.
  13. 그렇지 않으면,
    1. patternText를 pattern의 각 16비트 요소를 유니코드 BMP 코드 포인트로 해석한 결과로 둡니다. 요소에는 UTF-16 디코딩을 적용하지 않습니다.
  14. parseResult를 ParsePattern(patternText, u, v)로 둡니다.
  15. parseResult가 SyntaxError 객체의 비어 있지 않은 List이면 SyntaxError 예외를 던집니다.
  16. 단언: parseResult는 Pattern Parse Node입니다.
  17. obj.[[OriginalSource]]를 pattern으로 설정합니다.
  18. obj.[[OriginalFlags]]를 flags로 설정합니다.
  19. capturingGroupsCount를 CountLeftCapturingParensWithin(parseResult)로 둡니다.
  20. regexpRecord를 RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }로 둡니다.
  21. obj.[[RegExpRecord]]를 regexpRecord로 설정합니다.
  22. obj.[[RegExpMatcher]]를 인수 regexpRecord를 사용한 parseResult의 CompilePattern으로 설정합니다.
  23. ? Set(obj, "lastIndex", +0𝔽, true)를 수행합니다.
  24. obj를 반환합니다.

22.2.3.4 Static Semantics: ParsePattern ( patternText, u, v )

추상 연산 ParsePattern. 인수 patternText (a sequence of Unicode code points), u (Boolean) 및 v (Boolean). 반환값: (구문 분석 노드 또는 a non-empty List of SyntaxError objects).

참고

이 절은 B.1.2.9에서 수정됩니다.

호출되면 다음 단계를 수행한다.

  1. v가 true이고 u가 true이면, 다음을 수행합니다.
    1. parseResult를 하나 이상의 SyntaxError 객체를 포함하는 List로 둡니다.
  2. 그렇지 않고 v가 true이면, 다음을 수행합니다.
    1. parseResult를 ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups])로 둡니다.
  3. 그렇지 않고 u가 true이면, 다음을 수행합니다.
    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 객체이면 해당 인수 자체를 반환합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 명시된 RegExp 동작을 상속하려는 하위 클래스 생성자는 필요한 내부 슬롯을 갖는 하위 클래스 인스턴스를 생성하고 초기화하기 위해 RegExp 생성자에 대한 super 호출을 포함해야 합니다.

22.2.4.1 RegExp ( patternOrRegexp, flags )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. patternIsRegExp를 ? IsRegExp(patternOrRegexp)로 둡니다.
  2. NewTarget이 undefined이면, 다음을 수행합니다.
    1. newTarget을 활성 함수 객체로 둡니다.
    2. patternIsRegExp가 true이고 flags가 undefined이면, 다음을 수행합니다.
      1. patternCtor를 ? Get(patternOrRegexp, "constructor")로 둡니다.
      2. SameValue(newTarget, patternCtor)가 true이면 patternOrRegexp를 반환합니다.
  3. 그렇지 않으면,
    1. newTarget을 NewTarget으로 둡니다.
  4. patternOrRegexp가 Object이고 patternOrRegexp에 [[RegExpMatcher]] 내부 슬롯이 있으면, 다음을 수행합니다.
    1. patternSource를 patternOrRegexp.[[OriginalSource]]로 둡니다.
    2. flags가 undefined이면 flags를 patternOrRegexp.[[OriginalFlags]]로 설정합니다.
  5. 그렇지 않고 patternIsRegExp가 true이면, 다음을 수행합니다.
    1. patternSource를 ? Get(patternOrRegexp, "source")로 둡니다.
    2. flags가 undefined이면, 다음을 수행합니다.
      1. flags를 ? Get(patternOrRegexp, "flags")로 설정합니다.
  6. 그렇지 않으면,
    1. patternSource를 patternOrRegexp로 둡니다.
  7. obj를 ? RegExpAlloc(newTarget)로 둡니다.
  8. ? RegExpInitialize(obj, patternSource, flags)를 반환합니다.
참고

pattern이 StringLiteral을 사용하여 제공되면 String이 이 함수에 의해 처리되기 전에 일반적인 이스케이프 시퀀스 치환이 수행됩니다. 이 함수가 인식해야 하는 이스케이프 시퀀스를 pattern에 포함해야 한다면, StringLiteral의 내용이 형성될 때 U+005C (REVERSE SOLIDUS) 코드 포인트가 제거되지 않도록 StringLiteral 안에서 이를 이스케이프해야 합니다.

22.2.5 RegExp 생성자의 프로퍼티

RegExp 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

22.2.5.1 RegExp.escape ( string )

이 함수는 정규 표현식 Pattern에서 특별할 가능성이 있는 문자를 동등한 이스케이프 시퀀스로 대체한 string의 복사본을 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. string이 String이 아니면 TypeError 예외를 던집니다.
  2. escaped를 빈 String으로 둡니다.
  3. codePointList를 StringToCodePoints(string)로 둡니다.
  4. codePointList의 각 코드 포인트 codePoint에 대해 다음을 수행합니다.
    1. escaped가 빈 String이고 codePoint가 DecimalDigit 또는 AsciiLetter 중 하나와 일치하면, 다음을 수행합니다.
      1. 참고: 선행 숫자를 이스케이프하면 출력이 \0 문자 이스케이프나 \1 같은 DecimalEscape 뒤에 사용될 수 있는 패턴 텍스트에 대응하면서도, 앞선 이스케이프 시퀀스의 확장으로 해석되는 대신 string과 일치하도록 보장합니다. 선행 ASCII 문자를 이스케이프하는 것도 \c 뒤의 문맥에 대해 동일한 역할을 합니다.
      2. numericValue를 codePoint의 숫자 값으로 둡니다.
      3. hex를 Number::toString(𝔽(numericValue), 16)으로 둡니다.
      4. 단언: hex의 길이는 2입니다.
      5. escaped를 코드 단위 0x005C (REVERSE SOLIDUS), "x" 및 hex의 문자열 연결로 설정합니다.
    2. 그렇지 않으면,
      1. escaped를 escaped와 EncodeForRegExpEscape(codePoint)의 문자열 연결로 설정합니다.
  5. escaped를 반환합니다.
참고

이름은 비슷하지만 EscapeRegExpPattern과 RegExp.escape는 비슷한 동작을 수행하지 않습니다. 전자는 문자열로 표현하기 위해 패턴을 이스케이프하고, 이 함수는 패턴 안에 표현하기 위해 문자열을 이스케이프합니다.

22.2.5.1.1 EncodeForRegExpEscape ( codePoint )

추상 연산 EncodeForRegExpEscape. 인수 codePoint (코드 포인트). 반환값: String. codePoint와 일치하는 Pattern을 나타내는 String을 반환합니다. codePoint가 공백 또는 ASCII 문장 부호이면 반환 값은 이스케이프 시퀀스입니다. 그렇지 않으면 반환 값은 codePoint 자체의 String 표현입니다. 호출되면 다음 단계를 수행한다.

  1. codePoint가 SyntaxCharacter와 일치하거나 codePoint가 U+002F (SOLIDUS)이면, 다음을 수행합니다.
    1. 0x005C (REVERSE SOLIDUS)와 UTF16EncodeCodePoint(codePoint)의 문자열 연결을 반환합니다.
  2. codePoint가 표 63의 “Code Point” 열에 나열된 코드 포인트이면, 다음을 수행합니다.
    1. 0x005C (REVERSE SOLIDUS)와 “Code Point” 열에 codePoint가 포함된 행의 “ControlEscape” 열 문자열의 문자열 연결을 반환합니다.
  3. otherPunctuators를 ",-=<>#&!%:;@~'`"와 코드 단위 0x0022 (QUOTATION MARK)의 문자열 연결로 둡니다.
  4. toEscape를 StringToCodePoints(otherPunctuators)로 둡니다.
  5. toEscape에 codePoint가 포함되어 있거나, codePoint가 WhiteSpace 또는 LineTerminator 중 하나와 일치하거나, codePoint가 선행 서로게이트 또는 후행 서로게이트와 동일한 숫자 값을 가지면, 다음을 수행합니다.
    1. codePointNumber를 codePoint의 숫자 값으로 둡니다.
    2. codePointNumber ≤ 0xFF이면, 다음을 수행합니다.
      1. hex를 Number::toString(𝔽(codePointNumber), 16)으로 둡니다.
      2. 코드 단위 0x005C (REVERSE SOLIDUS), "x" 및 StringPad(hex, 2, "0", start)의 문자열 연결을 반환합니다.
    3. escaped를 빈 String으로 둡니다.
    4. codeUnits를 UTF16EncodeCodePoint(codePoint)로 둡니다.
    5. codeUnits의 각 코드 단위 codeUnit에 대해 다음을 수행합니다.
      1. escaped를 escaped와 UnicodeEscape(codeUnit)의 문자열 연결로 설정합니다.
    6. escaped를 반환합니다.
  6. UTF16EncodeCodePoint(codePoint)를 반환합니다.

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]"입니다.

참고

RegExp 프로토타입 메서드는 일반적으로 this 값의 생성자를 사용하여 파생 객체를 생성합니다. 그러나 하위 클래스 생성자는 자신의 %Symbol.species% 프로퍼티를 재정의하여 이 기본 동작을 재정의할 수 있습니다.

22.2.6 RegExp 프로토타입 객체의 프로퍼티

RegExp 프로토타입 객체는:

  • %RegExp.prototype%입니다.
  • 일반 객체입니다.
  • RegExp 인스턴스가 아니며 [[RegExpMatcher]] 내부 슬롯 또는 RegExp 인스턴스 객체의 다른 어떤 내부 슬롯도 갖지 않습니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
참고

RegExp 프로토타입 객체는 자체 "valueOf" 프로퍼티를 갖지 않습니다. 그러나 Object 프로토타입 객체에서 "valueOf" 프로퍼티를 상속합니다.

22.2.6.1 RegExp.prototype.constructor

RegExp.prototype.constructor의 초기 값은 %RegExp%입니다.

22.2.6.2 RegExp.prototype.exec ( string )

이 메서드는 string에서 정규 표현식 패턴의 출현을 검색하고 일치 결과를 포함하는 Array를 반환하며, string이 일치하지 않으면 null을 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. ? RequireInternalSlot(regexp, [[RegExpMatcher]])를 수행합니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. ? RegExpBuiltinExec(regexp, string)를 반환합니다.

22.2.6.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAll은 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0073 (LATIN SMALL LETTER S)으로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.6.4 get RegExp.prototype.flags

RegExp.prototype.flags는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. codeUnits를 새로운 빈 List로 둡니다.
  4. hasIndices를 ToBoolean(? Get(regexp, "hasIndices"))로 둡니다.
  5. hasIndices가 true이면 코드 단위 0x0064 (LATIN SMALL LETTER D)를 codeUnits에 추가합니다.
  6. global을 ToBoolean(? Get(regexp, "global"))로 둡니다.
  7. global이 true이면 코드 단위 0x0067 (LATIN SMALL LETTER G)를 codeUnits에 추가합니다.
  8. ignoreCase를 ToBoolean(? Get(regexp, "ignoreCase"))로 둡니다.
  9. ignoreCase가 true이면 코드 단위 0x0069 (LATIN SMALL LETTER I)를 codeUnits에 추가합니다.
  10. multiline을 ToBoolean(? Get(regexp, "multiline"))로 둡니다.
  11. multiline이 true이면 코드 단위 0x006D (LATIN SMALL LETTER M)를 codeUnits에 추가합니다.
  12. dotAll을 ToBoolean(? Get(regexp, "dotAll"))로 둡니다.
  13. dotAll이 true이면 코드 단위 0x0073 (LATIN SMALL LETTER S)를 codeUnits에 추가합니다.
  14. unicode를 ToBoolean(? Get(regexp, "unicode"))로 둡니다.
  15. unicode가 true이면 코드 단위 0x0075 (LATIN SMALL LETTER U)를 codeUnits에 추가합니다.
  16. unicodeSets를 ToBoolean(? Get(regexp, "unicodeSets"))로 둡니다.
  17. unicodeSets가 true이면 코드 단위 0x0076 (LATIN SMALL LETTER V)를 codeUnits에 추가합니다.
  18. sticky를 ToBoolean(? Get(regexp, "sticky"))로 둡니다.
  19. sticky가 true이면 코드 단위 0x0079 (LATIN SMALL LETTER Y)를 codeUnits에 추가합니다.
  20. 코드 단위가 List codeUnits의 요소인 String 값을 반환합니다. codeUnits에 요소가 없으면 빈 String을 반환합니다.

22.2.6.4.1 RegExpHasFlag ( regexp, codeUnit )

추상 연산 RegExpHasFlag. 인수 regexp (ECMAScript 언어 값) 및 codeUnit (코드 단위). 반환값: (정상 완료 (값: (Boolean 또는 undefined)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  2. regexp에 [[OriginalFlags]] 내부 슬롯이 없으면, 다음을 수행합니다.
    1. SameValue(regexp, %RegExp.prototype%)가 true이면 undefined를 반환합니다.
    2. TypeError 예외를 던집니다.
  3. flags를 regexp.[[OriginalFlags]]로 둡니다.
  4. flags에 codeUnit이 포함되어 있으면 true를 반환합니다.
  5. false를 반환합니다.

22.2.6.5 get RegExp.prototype.global

RegExp.prototype.global은 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0067 (LATIN SMALL LETTER G)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.6.6 get RegExp.prototype.hasIndices

RegExp.prototype.hasIndices는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0064 (LATIN SMALL LETTER D)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.6.7 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCase는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0069 (LATIN SMALL LETTER I)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. flags를 ? ToString(? Get(regexp, "flags"))로 둡니다.
  5. flags에 "g"가 포함되어 있지 않으면 ? RegExpExec(regexp, string)를 반환합니다.
  6. flags에 "u" 또는 "v"가 포함되어 있으면 fullUnicode를 true로 둡니다. 그렇지 않으면 fullUnicode를 false로 둡니다.
  7. ? Set(regexp, "lastIndex", +0𝔽, true)를 수행합니다.
  8. array를 ! ArrayCreate(0)으로 둡니다.
  9. matchCount를 0으로 둡니다.
  10. 다음을 반복합니다.
    1. result를 ? RegExpExec(regexp, string)로 둡니다.
    2. result가 null이면, 다음을 수행합니다.
      1. matchCount = 0이면 null을 반환합니다.
      2. array를 반환합니다.
    3. matchString을 ? ToString(? Get(result, "0"))로 둡니다.
    4. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(matchCount)), matchString)을 수행합니다.
    5. matchString이 빈 String이면, 다음을 수행합니다.
      1. thisIndex를 ℝ(? ToLength(? Get(regexp, "lastIndex")))로 둡니다.
      2. nextIndex를 AdvanceStringIndex(string, thisIndex, fullUnicode)로 둡니다.
      3. ? Set(regexp, "lastIndex", 𝔽(nextIndex), true)를 수행합니다.
    6. matchCount를 matchCount + 1로 설정합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.match]"입니다.

참고

%Symbol.match% 프로퍼티는 IsRegExp 추상 연산이 정규 표현식의 기본 동작을 갖는 객체를 식별하는 데 사용합니다. %Symbol.match% 프로퍼티가 없거나 해당 프로퍼티의 값이 Boolean으로 강제 변환되어 true가 되지 않으면 해당 객체는 정규 표현식 객체로 사용하도록 의도되지 않은 것입니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. speciesCtor를 ? SpeciesConstructor(regexp, %RegExp%)로 둡니다.
  5. flags를 ? ToString(? Get(regexp, "flags"))로 둡니다.
  6. matcher를 ? Construct(speciesCtor, « regexp, flags »)로 둡니다.
  7. lastIndex를 ? ToLength(? Get(regexp, "lastIndex"))로 둡니다.
  8. ? Set(matcher, "lastIndex", lastIndex, true)를 수행합니다.
  9. flags에 "g"가 포함되어 있으면 global을 true로 둡니다.
  10. 그렇지 않으면 global을 false로 둡니다.
  11. flags에 "u" 또는 "v"가 포함되어 있으면 fullUnicode를 true로 둡니다.
  12. 그렇지 않으면 fullUnicode를 false로 둡니다.
  13. CreateRegExpStringIterator(matcher, string, global, fullUnicode)를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.matchAll]"입니다.

22.2.6.10 get RegExp.prototype.multiline

RegExp.prototype.multiline은 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x006D (LATIN SMALL LETTER M)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. stringLength를 string의 길이로 둡니다.
  5. functionalReplace를 IsCallable(replaceValue)로 둡니다.
  6. functionalReplace가 false이면, 다음을 수행합니다.
    1. replaceValue를 ? ToString(replaceValue)으로 설정합니다.
  7. flags를 ? ToString(? Get(regexp, "flags"))로 둡니다.
  8. flags에 "g"가 포함되어 있으면 global을 true로 둡니다. 그렇지 않으면 global을 false로 둡니다.
  9. global이 true이면, 다음을 수행합니다.
    1. ? Set(regexp, "lastIndex", +0𝔽, true)를 수행합니다.
  10. results를 새로운 빈 List로 둡니다.
  11. done을 false로 둡니다.
  12. done이 false인 동안 다음을 반복합니다.
    1. result를 ? RegExpExec(regexp, string)로 둡니다.
    2. result가 null이면, 다음을 수행합니다.
      1. done을 true로 설정합니다.
    3. 그렇지 않으면,
      1. result를 results에 추가합니다.
      2. global이 false이면, 다음을 수행합니다.
        1. done을 true로 설정합니다.
      3. 그렇지 않으면,
        1. matchString을 ? ToString(? Get(result, "0"))로 둡니다.
        2. matchString이 빈 String이면, 다음을 수행합니다.
          1. thisIndex를 ℝ(? ToLength(? Get(regexp, "lastIndex")))로 둡니다.
          2. flags에 "u" 또는 "v"가 포함되어 있으면 fullUnicode를 true로 둡니다. 그렇지 않으면 fullUnicode를 false로 둡니다.
          3. nextIndex를 AdvanceStringIndex(string, thisIndex, fullUnicode)로 둡니다.
          4. ? Set(regexp, "lastIndex", 𝔽(nextIndex), true)를 수행합니다.
  13. accumulatedResult를 빈 String으로 둡니다.
  14. nextSourcePosition을 0으로 둡니다.
  15. results의 각 요소 result에 대해 다음을 수행합니다.
    1. resultLength를 ? LengthOfArrayLike(result)로 둡니다.
    2. capturesCount를 max(resultLength - 1, 0)으로 둡니다.
    3. matched를 ? ToString(? Get(result, "0"))로 둡니다.
    4. matchLength를 matched의 길이로 둡니다.
    5. position을 ? ToIntegerOrInfinity(? Get(result, "index"))로 둡니다.
    6. position을 position을 0과 stringLength 사이로 제한한 결과로 설정합니다.
    7. captures를 새로운 빈 List로 둡니다.
    8. captureNumber를 1로 둡니다.
    9. captureNumber ≤ capturesCount인 동안 다음을 반복합니다.
      1. capture를 ? Get(result, ! ToString(𝔽(captureNumber)))로 둡니다.
      2. capture가 undefined가 아니면, 다음을 수행합니다.
        1. capture를 ? ToString(capture)으로 설정합니다.
      3. capture를 captures에 추가합니다.
      4. 참고: captureNumber = 1일 때 앞선 단계는 첫 번째 요소를 captures(인덱스 0)에 넣습니다. 더 일반적으로 captureNumberth 캡처(captureNumberth 캡처링 괄호 집합이 캡처한 문자)는 captures[captureNumber - 1]에 있습니다.
      5. captureNumber를 captureNumber + 1로 설정합니다.
    10. namedCaptures를 ? Get(result, "groups")로 둡니다.
    11. functionalReplace가 true이면, 다음을 수행합니다.
      1. replacerArgs를 « matched », captures 및 « 𝔽(position), string »의 목록 연결로 둡니다.
      2. namedCaptures가 undefined가 아니면, 다음을 수행합니다.
        1. namedCaptures를 replacerArgs에 추가합니다.
      3. replacementValue를 ? Call(replaceValue, undefined, replacerArgs)로 둡니다.
      4. replacementString을 ? ToString(replacementValue)으로 둡니다.
    12. 그렇지 않으면,
      1. namedCaptures가 undefined가 아니면, 다음을 수행합니다.
        1. namedCaptures를 ? ToObject(namedCaptures)로 설정합니다.
      2. replacementString을 ? GetSubstitution(matched, string, position, captures, namedCaptures, replaceValue)로 둡니다.
    13. position ≥ nextSourcePosition이면, 다음을 수행합니다.
      1. 참고: position은 일반적으로 뒤로 이동해서는 안 됩니다. 뒤로 이동하면 잘못 동작하는 RegExp 하위 클래스 또는 접근 시 발생하는 부수 효과를 이용하여 regexp의 global 플래그나 다른 특성을 변경한 것을 나타냅니다. 이러한 경우 대응하는 치환은 무시됩니다.
      2. accumulatedResult를 accumulatedResult, string의 nextSourcePosition부터 position까지의 부분 문자열 및 replacementString의 문자열 연결로 설정합니다.
      3. nextSourcePosition을 position + matchLength로 설정합니다.
  16. nextSourcePosition ≥ stringLength이면 accumulatedResult를 반환합니다.
  17. accumulatedResult와 string의 nextSourcePosition부터의 부분 문자열의 문자열 연결을 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.replace]"입니다.

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

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. previousLastIndex를 ? Get(regexp, "lastIndex")로 둡니다.
  5. previousLastIndex가 +0𝔽이 아니면, 다음을 수행합니다.
    1. ? Set(regexp, "lastIndex", +0𝔽, true)를 수행합니다.
  6. result를 ? RegExpExec(regexp, string)로 둡니다.
  7. currentLastIndex를 ? Get(regexp, "lastIndex")로 둡니다.
  8. SameValue(currentLastIndex, previousLastIndex)가 false이면, 다음을 수행합니다.
    1. ? Set(regexp, "lastIndex", previousLastIndex, true)를 수행합니다.
  9. result가 null이면 -1𝔽을 반환합니다.
  10. ? Get(result, "index")를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.search]"입니다.

참고

검색을 수행할 때 이 RegExp 객체의 "lastIndex" 및 "global" 프로퍼티는 무시됩니다. "lastIndex" 프로퍼티는 변경되지 않은 채 유지됩니다.

22.2.6.13 get RegExp.prototype.source

RegExp.prototype.source는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. regexp에 [[OriginalSource]] 내부 슬롯이 없으면, 다음을 수행합니다.
    1. SameValue(regexp, %RegExp.prototype%)가 true이면 "(?:)"를 반환합니다.
    2. TypeError 예외를 던집니다.
  4. 단언: regexp에는 [[OriginalFlags]] 내부 슬롯이 있습니다.
  5. source를 regexp.[[OriginalSource]]로 둡니다.
  6. flags를 regexp.[[OriginalFlags]]로 둡니다.
  7. EscapeRegExpPattern(source, flags)을 반환합니다.

22.2.6.13.1 EscapeRegExpPattern ( pattern, flags )

추상 연산 EscapeRegExpPattern. 인수 pattern (String) 및 flags (String). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. flags에 "v"가 포함되어 있으면, 다음을 수행합니다.
    1. patternSymbol을 Pattern[+UnicodeMode, +UnicodeSetsMode]로 둡니다.
  2. 그렇지 않고 flags에 "u"가 포함되어 있으면, 다음을 수행합니다.
    1. patternSymbol을 Pattern[+UnicodeMode, ~UnicodeSetsMode]로 둡니다.
  3. 그렇지 않으면,
    1. patternSymbol을 Pattern[~UnicodeMode, ~UnicodeSetsMode]로 둡니다.
  4. escapedPattern을 UTF-16 인코딩 유니코드 코드 포인트(6.1.4)로 해석된 pattern과 동등한 patternSymbol 형식의 String으로 둡니다. 여기서 특정 코드 포인트는 아래 설명에 따라 이스케이프됩니다. escapedPattern은 pattern과 다를 수도 있고 다르지 않을 수도 있습니다. 그러나 escapedPattern을 patternSymbol로 평가하여 생성되는 Abstract Closure는 생성된 객체의 [[RegExpMatcher]] 내부 슬롯이 제공하는 Abstract Closure와 동일하게 동작해야 합니다. 동일한 pattern 및 flags 값으로 이 추상 연산을 여러 번 호출하면 동일한 결과를 생성해야 합니다.
  5. 패턴에 나타나는 코드 포인트 / 또는 모든 LineTerminator는 "/", escapedPattern, "/" 및 flags의 문자열 연결이 (적절한 어휘 문맥에서) 생성된 정규 표현식과 동일하게 동작하는 RegularExpressionLiteral로 파싱될 수 있도록 필요한 경우 escapedPattern에서 이스케이프해야 합니다. 예를 들어 pattern이 "/"이면 escapedPattern은 여러 가능성 중 "\/" 또는 "\u002F"일 수 있지만 "/"일 수는 없습니다. flags 뒤의 ///는 RegularExpressionLiteral이 아니라 SingleLineComment로 파싱되기 때문입니다. pattern이 빈 String이면 escapedPattern을 "(?:)"로 두어 이 명세를 충족할 수 있습니다.
  6. escapedPattern을 반환합니다.
참고

이름은 비슷하지만 RegExp.escape와 EscapeRegExpPattern은 비슷한 동작을 수행하지 않습니다. 전자는 패턴 안에 표현하기 위해 문자열을 이스케이프하고, 이 함수는 문자열로 표현하기 위해 패턴을 이스케이프합니다.

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

참고 1

이 메서드는 string을 String으로 변환한 결과의 부분 문자열을 저장한 Array를 반환합니다. 부분 문자열은 왼쪽에서 오른쪽으로 this 값 정규 표현식의 일치를 검색하여 결정됩니다. 이러한 출현은 반환되는 배열의 어떤 String에도 포함되지 않고 String 값을 나누는 역할을 합니다.

this 값은 빈 정규 표현식 또는 빈 String과 일치할 수 있는 정규 표현식일 수 있습니다. 이 경우 정규 표현식은 입력 String의 시작이나 끝에 있는 빈 부분 문자열과 일치하지 않으며 이전 구분자 일치의 끝에 있는 빈 부분 문자열과도 일치하지 않습니다. (예를 들어 정규 표현식이 빈 String과 일치하면 String은 개별 코드 단위 요소로 분할됩니다. 결과 배열의 길이는 String의 길이와 같고 각 부분 문자열에는 하나의 코드 단위가 포함됩니다.) 백트래킹을 통해 해당 인덱스에서 비어 있지 않은 부분 문자열 일치를 얻을 수 있더라도 String의 특정 인덱스에서는 첫 번째 일치만 고려합니다. (예를 들어 /a*?/[Symbol.split]("ab")는 배열 ["a", "b"]로 평가되지만 /a*/[Symbol.split]("ab")는 배열 ["","b"]로 평가됩니다.)

string이 빈 String이거나 빈 String으로 변환되는 경우 결과는 정규 표현식이 빈 String과 일치할 수 있는지에 따라 달라집니다. 일치할 수 있으면 결과 배열에는 요소가 없습니다. 그렇지 않으면 결과 배열에는 빈 String인 하나의 요소가 있습니다.

정규 표현식에 캡처링 괄호가 포함되어 있으면 separator가 일치할 때마다 캡처링 괄호의 결과(undefined 결과 포함)가 출력 배열에 삽입됩니다. 예를 들어,

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

는 다음 배열로 평가됩니다.

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

limit가 undefined가 아니면 출력 배열은 limit개보다 많은 요소를 포함하지 않도록 잘립니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. speciesCtor를 ? SpeciesConstructor(regexp, %RegExp%)로 둡니다.
  5. flags를 ? ToString(? Get(regexp, "flags"))로 둡니다.
  6. flags에 "u" 또는 "v"가 포함되어 있으면 unicodeMatching을 true로 둡니다.
  7. 그렇지 않으면 unicodeMatching을 false로 둡니다.
  8. flags에 "y"가 포함되어 있으면 newFlags를 flags로 둡니다.
  9. 그렇지 않으면 newFlags를 flags와 "y"의 문자열 연결로 둡니다.
  10. splitter를 ? Construct(speciesCtor, « regexp, newFlags »)로 둡니다.
  11. array를 ! ArrayCreate(0)으로 둡니다.
  12. lengthA를 0으로 둡니다.
  13. limit가 undefined이면 lim을 232 - 1로 둡니다. 그렇지 않으면 lim을 ℝ(? ToUint32(limit))로 둡니다.
  14. lim = 0이면 array를 반환합니다.
  15. string이 빈 String이면, 다음을 수행합니다.
    1. matchResult를 ? RegExpExec(splitter, string)로 둡니다.
    2. matchResult가 null이 아니면 array를 반환합니다.
    3. ! CreateDataPropertyOrThrow(array, "0", string)을 수행합니다.
    4. array를 반환합니다.
  16. size를 string의 길이로 둡니다.
  17. lastMatchEnd를 0으로 둡니다.
  18. searchIndex를 lastMatchEnd로 둡니다.
  19. searchIndex < size인 동안 다음을 반복합니다.
    1. ? Set(splitter, "lastIndex", 𝔽(searchIndex), true)를 수행합니다.
    2. matchResult를 ? RegExpExec(splitter, string)로 둡니다.
    3. matchResult가 null이면, 다음을 수행합니다.
      1. searchIndex를 AdvanceStringIndex(string, searchIndex, unicodeMatching)로 설정합니다.
    4. 그렇지 않으면,
      1. matchEnd를 ℝ(? ToLength(? Get(splitter, "lastIndex")))로 둡니다.
      2. matchEnd를 min(matchEnd, size)로 설정합니다.
      3. matchEnd = lastMatchEnd이면, 다음을 수행합니다.
        1. searchIndex를 AdvanceStringIndex(string, searchIndex, unicodeMatching)로 설정합니다.
      4. 그렇지 않으면,
        1. substring을 string의 lastMatchEnd부터 searchIndex까지의 부분 문자열로 둡니다.
        2. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), substring)을 수행합니다.
        3. lengthA를 lengthA + 1로 설정합니다.
        4. lengthA = lim이면 array를 반환합니다.
        5. lastMatchEnd를 matchEnd로 설정합니다.
        6. numberOfCaptures를 ? LengthOfArrayLike(matchResult)로 둡니다.
        7. numberOfCaptures를 max(numberOfCaptures - 1, 0)으로 설정합니다.
        8. captureIndex를 1로 둡니다.
        9. captureIndex ≤ numberOfCaptures인 동안 다음을 반복합니다.
          1. nextCapture를 ? Get(matchResult, ! ToString(𝔽(captureIndex)))로 둡니다.
          2. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), nextCapture)를 수행합니다.
          3. captureIndex를 captureIndex + 1로 설정합니다.
          4. lengthA를 lengthA + 1로 설정합니다.
          5. lengthA = lim이면 array를 반환합니다.
        10. searchIndex를 lastMatchEnd로 설정합니다.
  20. substring을 string의 lastMatchEnd부터 size까지의 부분 문자열로 둡니다.
  21. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), substring)을 수행합니다.
  22. array를 반환합니다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.split]"입니다.

참고 2

이 메서드는 이 RegExp 객체의 "global" 및 "sticky" 프로퍼티 값을 무시합니다.

22.2.6.15 get RegExp.prototype.sticky

RegExp.prototype.sticky는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0079 (LATIN SMALL LETTER Y)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.6.16 RegExp.prototype.test ( string )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. string을 ? ToString(string)으로 설정합니다.
  4. match를 ? RegExpExec(regexp, string)로 둡니다.
  5. match가 null이면 false를 반환합니다.
  6. true를 반환합니다.

22.2.6.17 RegExp.prototype.toString ( )

  1. regexp를 this 값으로 둡니다.
  2. regexp가 Object가 아니면 TypeError 예외를 던집니다.
  3. pattern을 ? ToString(? Get(regexp, "source"))로 둡니다.
  4. flags를 ? ToString(? Get(regexp, "flags"))로 둡니다.
  5. result를 "/", pattern, "/" 및 flags의 문자열 연결로 둡니다.
  6. result를 반환합니다.
참고

반환된 String은 이 객체와 동일한 동작을 하는 다른 RegExp 객체로 평가되는 RegularExpressionLiteral 형식을 갖습니다.

22.2.6.18 get RegExp.prototype.unicode

RegExp.prototype.unicode는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0075 (LATIN SMALL LETTER U)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.6.19 get RegExp.prototype.unicodeSets

RegExp.prototype.unicodeSets는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. regexp를 this 값으로 둡니다.
  2. codeUnit을 코드 단위 0x0076 (LATIN SMALL LETTER V)로 둡니다.
  3. ? RegExpHasFlag(regexp, codeUnit)를 반환합니다.

22.2.7 RegExp 일치를 위한 추상 연산

22.2.7.1 RegExpExec ( regexp, string )

추상 연산 RegExpExec. 인수 regexp (Object) 및 string (String). 반환값: (정상 완료 (값: (Object 또는 null)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. exec을 ? Get(regexp, "exec")로 둡니다.
  2. IsCallable(exec)이 true이면, 다음을 수행합니다.
    1. result를 ? Call(exec, regexp, « string »)로 둡니다.
    2. result가 Object가 아니고 result가 null도 아니면 TypeError 예외를 던집니다.
    3. result를 반환합니다.
  3. ? RequireInternalSlot(regexp, [[RegExpMatcher]])를 수행합니다.
  4. ? RegExpBuiltinExec(regexp, string)를 반환합니다.
참고

호출 가능한 "exec" 프로퍼티를 찾지 못하면 이 알고리즘은 내장 RegExp 일치 알고리즘 사용을 시도하는 방식으로 대체합니다. 이는 정규 표현식을 사용하는 대부분의 내장 알고리즘이 "exec"의 동적 프로퍼티 조회를 수행하지 않았던 이전 판을 위해 작성된 코드와 호환되는 동작을 제공합니다.

22.2.7.2 RegExpBuiltinExec ( regexp, string )

추상 연산 RegExpBuiltinExec. 인수 regexp (an initialized RegExp instance) 및 string (String). 반환값: (정상 완료 (값: (Array 특수 객체 또는 null)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. lastIndex를 ℝ(? ToLength(! Get(regexp, "lastIndex")))로 둡니다.
  3. flags를 regexp.[[OriginalFlags]]로 둡니다.
  4. flags에 "g"가 포함되어 있으면 global을 true로 둡니다. 그렇지 않으면 global을 false로 둡니다.
  5. flags에 "y"가 포함되어 있으면 sticky를 true로 둡니다. 그렇지 않으면 sticky를 false로 둡니다.
  6. flags에 "d"가 포함되어 있으면 hasIndices를 true로 둡니다. 그렇지 않으면 hasIndices를 false로 둡니다.
  7. global이 false이고 sticky가 false이면 lastIndex를 0으로 설정합니다.
  8. matcher를 regexp.[[RegExpMatcher]]로 둡니다.
  9. flags에 "u" 또는 "v"가 포함되어 있으면 fullUnicode를 true로 둡니다. 그렇지 않으면 fullUnicode를 false로 둡니다.
  10. matchSucceeded를 false로 둡니다.
  11. fullUnicode가 true이면 input을 StringToCodePoints(string)로 둡니다. 그렇지 않으면 input을 string의 요소인 코드 단위로 구성된 List로 둡니다.
  12. 참고: input의 각 요소는 문자로 간주됩니다.
  13. matchSucceeded가 false인 동안 다음을 반복합니다.
    1. lastIndex > length이면, 다음을 수행합니다.
      1. global이 true이거나 sticky가 true이면, 다음을 수행합니다.
        1. ? Set(regexp, "lastIndex", +0𝔽, true)를 수행합니다.
      2. null을 반환합니다.
    2. inputIndex를 string의 요소 lastIndex에서 얻은 문자의 input 안의 인덱스로 둡니다.
    3. result를 matcher(input, inputIndex)로 둡니다.
    4. result가 failure이면, 다음을 수행합니다.
      1. sticky가 true이면, 다음을 수행합니다.
        1. ? Set(regexp, "lastIndex", +0𝔽, true)를 수행합니다.
        2. null을 반환합니다.
      2. lastIndex를 AdvanceStringIndex(string, lastIndex, fullUnicode)로 설정합니다.
    5. 그렇지 않으면,
      1. 단언: result는 MatchState입니다.
      2. matchSucceeded를 true로 설정합니다.
  14. endIndex를 result.[[EndIndex]]로 둡니다.
  15. fullUnicode가 true이면 endIndex를 GetStringIndex(string, endIndex)로 설정합니다.
  16. global이 true이거나 sticky가 true이면, 다음을 수행합니다.
    1. ? Set(regexp, "lastIndex", 𝔽(endIndex), true)를 수행합니다.
  17. capturingGroupsCount를 result.[[Captures]]의 요소 수로 둡니다.
  18. 단언: capturingGroupsCount = regexp.[[RegExpRecord]].[[CapturingGroupsCount]]입니다.
  19. 단언: capturingGroupsCount < 232 - 1입니다.
  20. array를 ! ArrayCreate(capturingGroupsCount + 1)로 둡니다.
  21. 단언: array의 "length" 프로퍼티의 수학적 값은 capturingGroupsCount + 1입니다.
  22. ! CreateDataPropertyOrThrow(array, "index", 𝔽(lastIndex))를 수행합니다.
  23. ! CreateDataPropertyOrThrow(array, "input", string)을 수행합니다.
  24. match를 Match Record { [[StartIndex]]: lastIndex, [[EndIndex]]: endIndex }로 둡니다.
  25. indices를 새로운 빈 List로 둡니다.
  26. groupNames를 새로운 빈 List로 둡니다.
  27. match를 indices에 추가합니다.
  28. matchedSubstring을 GetMatchString(string, match)으로 둡니다.
  29. ! CreateDataPropertyOrThrow(array, "0", matchedSubstring)을 수행합니다.
  30. regexp에 어떤 GroupName이라도 포함되어 있으면, 다음을 수행합니다.
    1. groups를 OrdinaryObjectCreate(null)로 둡니다.
    2. hasGroups를 true로 둡니다.
  31. 그렇지 않으면,
    1. groups를 undefined로 둡니다.
    2. hasGroups를 false로 둡니다.
  32. ! CreateDataPropertyOrThrow(array, "groups", groups)를 수행합니다.
  33. matchedGroupNames를 새로운 빈 List로 둡니다.
  34. 1 ≤ i ≤ capturingGroupsCount를 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
    1. capture를 result.[[Captures]]의 ith 요소로 둡니다.
    2. capture가 undefined이면, 다음을 수행합니다.
      1. capturedValue를 undefined로 둡니다.
      2. undefined를 indices에 추가합니다.
    3. 그렇지 않으면,
      1. captureStart를 capture.[[StartIndex]]로 둡니다.
      2. captureEnd를 capture.[[EndIndex]]로 둡니다.
      3. fullUnicode가 true이면, 다음을 수행합니다.
        1. captureStart를 GetStringIndex(string, captureStart)로 설정합니다.
        2. captureEnd를 GetStringIndex(string, captureEnd)로 설정합니다.
      4. captureRecord를 Match Record { [[StartIndex]]: captureStart, [[EndIndex]]: captureEnd }로 둡니다.
      5. capturedValue를 GetMatchString(string, captureRecord)으로 둡니다.
      6. captureRecord를 indices에 추가합니다.
    4. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(i)), capturedValue)를 수행합니다.
    5. regexp의 ith 캡처가 GroupName으로 정의되어 있으면, 다음을 수행합니다.
      1. groupName을 해당 GroupName의 CapturingGroupName으로 둡니다.
      2. matchedGroupNames에 groupName이 포함되어 있으면, 다음을 수행합니다.
        1. 단언: capturedValue는 undefined입니다.
        2. undefined를 groupNames에 추가합니다.
      3. 그렇지 않으면,
        1. capturedValue가 undefined가 아니면 groupName을 matchedGroupNames에 추가합니다.
        2. 참고: 이름이 groupName인 그룹이 여러 개 있으면 이 시점에 groups가 이미 groupName 프로퍼티를 가질 수 있습니다. 그러나 groups는 모든 프로퍼티가 쓰기 가능한 데이터 프로퍼티인 일반 객체이므로 CreateDataPropertyOrThrow 호출은 그럼에도 반드시 성공합니다.
        3. ! CreateDataPropertyOrThrow(groups, groupName, capturedValue)를 수행합니다.
        4. groupName을 groupNames에 추가합니다.
    6. 그렇지 않으면,
      1. undefined를 groupNames에 추가합니다.
  35. hasIndices가 true이면, 다음을 수행합니다.
    1. indicesArray를 MakeMatchIndicesIndexPairArray(string, indices, groupNames, hasGroups)로 둡니다.
    2. ! CreateDataPropertyOrThrow(array, "indices", indicesArray)를 수행합니다.
  36. array를 반환합니다.

22.2.7.3 AdvanceStringIndex ( string, index, unicode )

추상 연산 AdvanceStringIndex. 인수 string (String), index (음이 아닌 정수) 및 unicode (Boolean). 반환값: 음이 아닌 정수. 호출되면 다음 단계를 수행한다.

  1. 단언: index ≤ 253 - 1입니다.
  2. unicode가 false이면 index + 1을 반환합니다.
  3. length를 string의 길이로 둡니다.
  4. index + 1 ≥ length이면 index + 1을 반환합니다.
  5. codePoint를 CodePointAt(string, index)로 둡니다.
  6. index + codePoint.[[CodeUnitCount]]를 반환합니다.

22.2.7.4 GetStringIndex ( string, codePointIndex )

추상 연산 GetStringIndex. 인수 string (String) 및 codePointIndex (음이 아닌 정수). 반환값: 음이 아닌 정수. 6.1.4에 설명된 대로 string을 UTF-16 인코딩 코드 포인트 시퀀스로 해석하고, 해당 인덱스가 존재하면 코드 포인트 인덱스 codePointIndex에 대응하는 코드 단위 인덱스를 반환합니다. 그렇지 않으면 string의 길이를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. string이 빈 String이면 0을 반환합니다.
  2. length를 string의 길이로 둡니다.
  3. codeUnitCount를 0으로 둡니다.
  4. codePointCount를 0으로 둡니다.
  5. codeUnitCount < length인 동안 다음을 반복합니다.
    1. codePointCount = codePointIndex이면 codeUnitCount를 반환합니다.
    2. codePoint를 CodePointAt(string, codeUnitCount)로 둡니다.
    3. codeUnitCount를 codeUnitCount + codePoint.[[CodeUnitCount]]로 설정합니다.
    4. codePointCount를 codePointCount + 1로 설정합니다.
  6. length를 반환합니다.

22.2.7.5 Match Record

Match Record는 정규 표현식 일치 또는 캡처의 시작 및 끝 인덱스를 캡슐화하는 데 사용하는 Record입니다.

Match Record에는 표 68에 나열된 필드가 있습니다.

표 68: Match Record 필드
필드 이름 값 의미
[[StartIndex]] a non-negative integer 일치가 시작하는 문자열의 시작부터의 코드 단위 수(포함)입니다.
[[EndIndex]] an integer ≥ [[StartIndex]] 일치가 끝나는 문자열의 시작부터의 코드 단위 수(제외)입니다.

22.2.7.6 GetMatchString ( string, match )

추상 연산 GetMatchString. 인수 string (String) 및 match (Match 레코드). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. 단언: match.[[StartIndex]] ≤ match.[[EndIndex]] ≤ string의 길이입니다.
  2. string의 match.[[StartIndex]]부터 match.[[EndIndex]]까지의 부분 문자열을 반환합니다.

22.2.7.7 GetMatchIndexPair ( string, match )

추상 연산 GetMatchIndexPair. 인수 string (String) 및 match (Match 레코드). 반환값: Array. 호출되면 다음 단계를 수행한다.

  1. 단언: match.[[StartIndex]] ≤ match.[[EndIndex]] ≤ string의 길이입니다.
  2. CreateArrayFromList(« 𝔽(match.[[StartIndex]]), 𝔽(match.[[EndIndex]]) »)를 반환합니다.

22.2.7.8 MakeMatchIndicesIndexPairArray ( string, indices, groupNames, hasGroups )

추상 연산 MakeMatchIndicesIndexPairArray. 인수 string (String), indices (리스트 (요소: (Match 레코드 또는 undefined))), groupNames (리스트 (요소: (String 또는 undefined))) 및 hasGroups (Boolean). 반환값: Array. 호출되면 다음 단계를 수행한다.

  1. n을 indices의 요소 수로 둡니다.
  2. 단언: n < 232 - 1입니다.
  3. 단언: groupNames에는 n - 1개의 요소가 있습니다.
  4. 참고: groupNames List에는 indices[1]부터 indices List와 정렬된 요소가 포함되어 있습니다.
  5. array를 ! ArrayCreate(n)으로 둡니다.
  6. hasGroups가 true이면, 다음을 수행합니다.
    1. groups를 OrdinaryObjectCreate(null)로 둡니다.
  7. 그렇지 않으면,
    1. groups를 undefined로 둡니다.
  8. ! CreateDataPropertyOrThrow(array, "groups", groups)를 수행합니다.
  9. 0 ≤ i < n을 만족하는 각 정수 i에 대해 오름차순으로 다음을 수행합니다.
    1. matchIndices를 indices[i]로 둡니다.
    2. matchIndices가 undefined가 아니면, 다음을 수행합니다.
      1. matchIndexPair를 GetMatchIndexPair(string, matchIndices)로 둡니다.
    3. 그렇지 않으면,
      1. matchIndexPair를 undefined로 둡니다.
    4. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(i)), matchIndexPair)를 수행합니다.
    5. i > 0이면, 다음을 수행합니다.
      1. name을 groupNames[i - 1]로 둡니다.
      2. name이 undefined가 아니면, 다음을 수행합니다.
        1. 단언: groups는 undefined가 아닙니다.
        2. 참고: 이름이 name인 그룹이 여러 개 있으면 이 시점에 groups가 이미 name 프로퍼티를 가질 수 있습니다. 그러나 groups는 모든 프로퍼티가 쓰기 가능한 데이터 프로퍼티인 일반 객체이므로 CreateDataPropertyOrThrow 호출은 그럼에도 반드시 성공합니다.
        3. ! CreateDataPropertyOrThrow(groups, name, matchIndexPair)를 수행합니다.
  10. array를 반환합니다.

22.2.8 RegExp 인스턴스의 프로퍼티

RegExp 인스턴스는 RegExp 프로토타입 객체에서 프로퍼티를 상속하는 일반 객체입니다. RegExp 인스턴스에는 [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]] 및 [[RegExpMatcher]] 내부 슬롯이 있습니다. [[RegExpMatcher]] 내부 슬롯의 값은 RegExp 객체의 Pattern을 나타내는 Abstract Closure입니다.

참고

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 String Iterator 객체

RegExp String Iterator는 특정 RegExp 인스턴스 객체에 대해 일치시키면서 특정 String 인스턴스 객체를 특정 방식으로 순회하는 객체입니다. RegExp String Iterator 객체에는 이름 있는 생성자가 없습니다. 대신 RegExp String Iterator 객체는 RegExp 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

22.2.9.1 CreateRegExpStringIterator ( regexp, string, global, fullUnicode )

추상 연산 CreateRegExpStringIterator. 인수 regexp (Object), string (String), global (Boolean) 및 fullUnicode (Boolean). 반환값: Object. 호출되면 다음 단계를 수행한다.

  1. iterator를 OrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] »)로 둡니다.
  2. iterator.[[IteratingRegExp]]를 regexp로 설정합니다.
  3. iterator.[[IteratedString]]을 string으로 설정합니다.
  4. iterator.[[Global]]을 global로 설정합니다.
  5. iterator.[[Unicode]]를 fullUnicode로 설정합니다.
  6. iterator.[[Done]]을 false로 설정합니다.
  7. iterator를 반환합니다.

22.2.9.2 %RegExpStringIteratorPrototype% 객체

%RegExpStringIteratorPrototype% 객체는:

22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )

  1. iteratorObj를 this 값으로 둡니다.
  2. iteratorObj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iteratorObj가 RegExp String Iterator Object Instance의 모든 내부 슬롯을 갖지 않으면(22.2.9.3 참조) TypeError 예외를 던집니다.
  4. iteratorObj.[[Done]]이 true이면, 다음을 수행합니다.
    1. CreateIteratorResultObject(undefined, true)를 반환합니다.
  5. regexp를 iteratorObj.[[IteratingRegExp]]로 둡니다.
  6. string을 iteratorObj.[[IteratedString]]으로 둡니다.
  7. global을 iteratorObj.[[Global]]로 둡니다.
  8. fullUnicode를 iteratorObj.[[Unicode]]로 둡니다.
  9. match를 ? RegExpExec(regexp, string)로 둡니다.
  10. match가 null이면, 다음을 수행합니다.
    1. iteratorObj.[[Done]]을 true로 설정합니다.
    2. CreateIteratorResultObject(undefined, true)를 반환합니다.
  11. global이 false이면, 다음을 수행합니다.
    1. iteratorObj.[[Done]]을 true로 설정합니다.
    2. CreateIteratorResultObject(match, false)를 반환합니다.
  12. matchString을 ? ToString(? Get(match, "0"))로 둡니다.
  13. matchString이 빈 String이면, 다음을 수행합니다.
    1. thisIndex를 ℝ(? ToLength(? Get(regexp, "lastIndex")))로 둡니다.
    2. nextIndex를 AdvanceStringIndex(string, thisIndex, fullUnicode)로 둡니다.
    3. ? Set(regexp, "lastIndex", 𝔽(nextIndex), true)를 수행합니다.
  14. CreateIteratorResultObject(match, false)를 반환합니다.

22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "RegExp String Iterator"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

22.2.9.3 RegExp String Iterator 인스턴스의 프로퍼티

RegExp String Iterator 인스턴스는 %RegExpStringIteratorPrototype% 내재 객체에서 프로퍼티를 상속하는 일반 객체입니다. RegExp String Iterator 인스턴스는 처음에 표 69에 나열된 내부 슬롯을 갖도록 생성됩니다.

표 69: RegExp String Iterator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[IteratingRegExp]] an Object 순회에 사용하는 정규 표현식입니다. IsRegExp([[IteratingRegExp]])의 초기 값은 true입니다.
[[IteratedString]] a String 순회 중인 String 값입니다.
[[Global]] a Boolean [[IteratingRegExp]]가 전역인지 여부를 나타냅니다.
[[Unicode]] a Boolean [[IteratingRegExp]]가 유니코드 모드인지 여부를 나타냅니다.
[[Done]] a Boolean 순회가 완료되었는지 여부를 나타냅니다.