2017-01-11 23 views
2

.NET 정규 표현식을 연구 중입니다. 알려진대로 8 진수 이스케이프 코드 (예 : \ 16)와 \ number 역 참조 사이에 모호성이 있습니다. https://msdn.microsoft.com/en-us/library/thwdfzxy.aspx.NET Regex " 19abc"는 무엇이 일치합니까?

내 질문은 : 그 번호를 가진 그룹이 정규식 패턴에 정의되지 않은 경우 \19 또는 \288 일치 같은 정규 표현식을 무엇 ?

유효 그룹 번호가 아니거나 유효한 8 진수 코드가 아닙니다. 하지만 유효한 정규 표현식입니다 (\14848486도 유효합니다). Regex 생성자는 ArgumentException을 throw하지 않지만 이러한 이스케이프 시퀀스와 일치하는 입력 문자열을 찾을 수 없습니다.

나는 방금 표현을 해석하는 방법에 호기심이 많습니다.

+0

'\ 14848486'은 8 진수 14와 일치하고 '848486' –

+0

의 시퀀스는 죄송합니다. 나는 '\ 18848486'(두 번째 숫자가 8 또는 9 일 때)을 의미했습니다. – rittergig

답변

2

패턴을 분석 할 수있는 여러 가지 가능성이있을 때 모호성이 발생합니다. 우리는 110 둘 다 기존 그룹을 참조 할 수 있기 때문에 모호성에 대해 말할 수있는 (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\10 패턴이 있습니다. NET 정규식 엔진은이 모호성을 최대한 큰 값으로 해결하고이 정규식 won't match 12345678901, but will match 12345678900을 해결합니다. 모호성을 제거하려면 \k<ID> 역 참조를 사용해야합니다. (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\k<1>0123456789010과 일치하지만 123456789000은 일치하지 않습니다.

\14848486 패턴은 여기에 모호성이 없으므로 8 진수 14 문자와 일치하고 848486의 시퀀스와 일치합니다.

\18848486 패턴은 8 진수 1 문자와 일치하고 8848486 문자의 문자와 일치합니다. this C# demo 참조 : \19\288에 관해서는

enter image description here

:

enter image description here

var s = Regex.Match("\u00018848486", @"\18848486"); 
if (s.Success) Console.WriteLine(s.Value); // => 8848486 
나는 또한 디버그 닷넷으로 정규 표현식에 Ultrapico 프레소 (NO 소속)를 사용하는 것이 좋습니다

는, 스크린 샷 참조

게다가, 역 참조 \k<1>8848486 에서처럼 누락 된 그룹에 대한 의미는 will get a System.ArgumentException: parsing '\k<1>8848486' - Reference to undefined group number N exception입니다. 8 또는 9\ 이후 인 경우 \8848486과 같이 System.ArgumentException: parsing '\8848486' - Unrecognized escape sequence N exception이 표시됩니다.

+0

"\ 18848486 패턴은 8 진수 1 문자와 일치하고 8848486 문자 시퀀스와 일치합니다." 정말입니까? MSDN 8 진수 표현에 관해서는 2 개 또는 트리 숫자가 필요합니다. 하지만 고마워요. 그러나, 나는 그것을 밖으로 시도 할 것이다. – rittergig

+0

예, 확신합니다. .NET regex 엔진은이 짧은 8 진수 문자 표기법을 허용합니다. 백 슬래시 뒤에 '8'또는 '9'가있는 경우가 2 개 있습니다. 파싱 예외가 발생했습니다. –

+0

네, 맞습니다. 방금 Visual Studio C# 대화식 창에 체크했는데 결과는 동일합니다. > System.Text.RegularExpressions.Regex.IsMatch (((char) 1) .ToString() + "9", @ "^ \ 01 [9] "); // true > System.Text.RegularExpressions.Regex.IsMatch (((char) 1) .ToString() + "9", @ "^ \ 19"); // true – rittergig

0

Wiktor Stribiżew가 맞습니다. 여기

는 (정식) \9을 통해 .NET 정규식 엔진

  • 표현식 \1의 행동 (더 이상의 다음과 같은 자리에) 항상 역 참조로 해석됩니다, 그리고 같은 기본 내 요약 8 진수 코드.(https://msdn.microsoft.com/en-us/library/thwdfzxy.aspx)
  • \1에서 을 사용하면 정규 표현식에서이 지정된 번호의 캡쳐 그룹이 정의되지 않은 경우 ArgumentException이 발생합니다. (parsing '\8' - Reference to undefined group number)
  • 다중 숫자 식인 경우 Regex 엔진은 먼저 번호가 매겨진 그룹 (캡처 그룹)에 대한 역 참조로 십진수 시퀀스 (\ 다음)를 일치 시키려고 시도합니다.
  • 정규 표현식 패턴에 그 번호를 가진 캡쳐 그룹이 정의되지 않은 경우 엔진은 숫자 시퀀스를 8 진수 코드로 해석하려고 시도합니다.
  • 3 자리 이상의 8 진수 (0 ... 7) 순서대로 엔진은 코드의 문자를 처음 3 자리 숫자와 일치시킵니다. 다음의 다른 숫자는 리터럴로 일치합니다.
    • 예 : \040 → 일치 octal 040
    • 예 : \0040 → 다음, octal 004 일치 0
    • 예 : \134 → 일치 octal 134
    • 예 : \134567 → 다음 다음 다음 octal 134, 5, 6, 7 일치
  • 그렇지 않으면 2 진수 (0 ... 7)가있는 경우 엔진은 코드의 문자를이 2 자리 숫자와 일치시킵니다. 다음의 다른 숫자는 리터럴로 일치합니다.
    • 예 : \13 → 일치 octal 13
    • 예 : \138567 → 다음 다음 다음 다음 octal 13, 8, 5, 6 일치 7
  • \0499
  • 예 다음, octal 04 일치 그렇지 않으면 1 8 진수 (0 ... 7)가있는 경우 엔진은 코드 wi의 문자와 일치합니다 이 1 자리. 다음의 다른 숫자는 리터럴로 일치합니다.
    • 예 : \0 → 일치 octal 0
    • 예 : \08 → 다음, octal 0 일치 8
    • 예 : \7 → 일치 octal 7
    • 예 : \19456 → 다음 다음 다음 octal 1, 9, 4, 5 일치 ,이어서 6
  • 그렇지 않으면 백 슬래시 뒤에 8 진수가 없으면 엔진은 ArgumentException을 throw합니다.
    • 예 : \81 →이 ArgumentException 발생 : parsing '\81' - Unrecognized escape sequence \8
    • 예 : \975 →이 ArgumentException 발생 : parsing '\975' - Unrecognized escape sequence \9

그러나 참고 : 당신이 RegexOption ECMAScript를 사용하는 경우 동작이 다릅니다. https://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#ECMAScript