2017-02-24 8 views
0

누군가 ECMAScript 표준에 따라 문자 클래스에서 10 진수 이스케이프의 의미를 설명 할 수 있습니까?일반 표현식의 문자 클래스에서 10 진수 이스케이프

예를 들어, 다음 패턴은 무엇을 의미합니까? 구문 오류가 발생해야합니까? 다음과 같이

  • 21.2.2.19 ClassEscape

    생산 ClassEscape :: DecimalEscape가 평가 : 여기

    [\11] 
    

    코어 사양에서 관련 부분이다

    1. 가 DecimalEscape 평가 EscapeValue를 얻는다. E.
    2. E가 문자가 아닌 경우 SyntaxError 예외를 발생시킵니다.
    3. ch가 E의 문자가되도록하십시오.
    4. 문자 ch가 포함 된 단일 요소 CharSet을 반환합니다.
      1. 내가 DecimalIntegerLiteral의 MV하자 :
      2. 21.2.2.11 DecimalEscape

        다음과 같이 DecimalEscape :: DecimalIntegerLiteral는 평가 생산

    .
  • i가 0이면 U + 0000 (NULL) 문자로 구성된 EscapeValue를 반환합니다.
  • 정수 i로 구성된 EscapeValue를 반환합니다.
  • "DecimalIntegerLiteral의 MV"의 정의는 11.8.3에 있습니다.

    • NOTE
      \이어서 이스케이프 시퀀스는 역 참조로 간주되어, 그 첫 번째 숫자 0이 아닌 진수 N, 다음 경우. n이 전체 정규 표현식에서 왼쪽 캡처 괄호의 총 수보다 큰 경우 오류가 발생합니다. \ 0은 문자를 나타내며 십진수가 올 수 없습니다.
    웹 브라우저의 추가 기능에 ClassEscape의 언급도 있습니다

:

  • B.1.4.1 Pattern Semantics

    ClassEscape (21.2.2.19) 다음의 추가 평가 규칙을 포함한다 : 다음 ...이 확인 된 경우에만

    제조 ClassEscape :: DecimalEscapebut는 :

    1. 하려면, escapeValue E.
    2. 어설 수득 DecimalEscape 평가 : E가 문자이다.
    3. ch가 E의 문자가되도록하십시오.
    4. 문자 ch가 포함 된 단일 요소 CharSet을 반환합니다.

내 주요 문제는 내가 그렇지 않으면 정수를 반환, 그것은 0가 (그때는 U+0000을 반환) 인식하는지 규칙 DecimalEscape는 문자를 생성하는 느낌,하지만 난을 얻을 수 있다는 것입니다 Firefox에서 Javascript 콘솔로 테스트 할 때 구문 오류가 발생합니다.

// This is the only one I understand: 
/[\0]/.test("\x00") // true 

// Now it gets strange 
/[\1]/.test("\x01") // true 
/[\2]/.test("\x02") // true 
/[\3]/.test("\x03") // true 
/[\4]/.test("\x04") // true 
/[\5]/.test("\x05") // true 
/[\6]/.test("\x06") // true 
/[\7]/.test("\x07") // true 
/[\8]/.test("\x08") // false 
/[\9]/.test("\x09") // false 
/[\10]/.test("\x0a") // false 
/[\11]/.test("\x0b") // false 

// This is not interpreted as `\1` and `0` 
/[\10]/.test("0") // false 

// Also, it's not a backreference 
/((((((((((a))))))))))[\10]/.test("aa") // false 

왜 7까지 true을 반환하지 다음 false :

여기에 내가 발견 된 일부 결과는? 이것은 8 진수와 관련이 없어야합니다. 나는 몇 가지 설명을 고맙게 생각한다.

답변

1
/[\0]/.test("\x00") 
... 
/[\7]/.test("\x07") 

반환 true 이스케이프 정수 8 진수 (8 기준)에 숫자로 볼 수 있습니다 때문이다.

분명히 기본 8에서 사용되지 않는 8과 9를 사용할 때 더 이상 가능하지 않습니다.이 경우 백 슬래시는 단순히 무시됩니다.

/[\10]/.test("\x0a") 
/[\11]/.test("\x0b") 

\10(기본 8) 보낸 복귀 false 8 (베이스 (10))을 준다.

/[\10]/.test("\x08") 
/[\11]/.test("\x09") 

true을 반환합니다.

이 동작은 브라우저의 추가 기능 (호환성)의 일부입니다. B.1.2 String Literals 섹션은 EscapeSequence의 생산 규칙에 LegacyOctalEscapeSequence을 추가합니다. 이 규칙은 0에서 255까지의 코드 단위에 대해까지의 8 진수 이스케이프를 정의합니다.

+0

Firefox와 Node.js는 _decimalEscape_를 8 진수로 해석합니다./(\ u00ff ")'/ [\ 400] /. test ("\ u0100 ")'는 false입니다. 잠깐 관측 일 뿐이므로이 동작을 명시한 신뢰할 수있는 출처에 대한 링크를 제공 할 수 있습니까? – Demurgos

+0

발견 : 브라우저 추가 (B.1.2)의 일부로, 답변을 편집했습니다. – Demurgos