2011-11-12 2 views
0
그들이 _x005F 앞에 때 나는 제외하고는 형식 _x[0-9A-F]{4}_와 진수 문자를 찾을 필요가

를 찾을 수 정규 표현식은 (닷넷 사용) 비 이스케이프 문자

나는 [^(_x005F)]_x[0-9A-F]{4}_을 시도했지만 그것 때문에 작동하지 않습니다 문자열 AA_x005F_x00FF_BB에서 _x005F_과 일치합니다 (이 경우에는 어떤 것도 일치시키지 않습니다). 예를 들어

(?<!pattern) 

: - 당신은 부정적인 lookbehind를 사용할 필요가

+0

@errorstacks 편집시주의하십시오. 원래 거기에 없었던 밑줄을 몇 개 도입했습니다. – detunized

+1

@detunized : 나는 OP에서 그 밑줄이 의도 된 것으로 생각한다. –

+0

@detunized 죄송합니다. 죄송합니다. 방금 업데이트를 받았습니다 ... –

답변

0

귀하의 질문은 매우 명확하지 않습니다,하지만 당신은 두 개의 매우 유사한 요구 사항을 갖고있는 것 같다 다음 이전 문자 x005F을 경우

  • 가 일치하지 않습니다.
  • 현재 문자가 x005F 인 경우 일치하지 마십시오.

이 시도 :

"(?<!_x005F)_x(?!005F)[0-9A-F]{4}_" 

전체 예 :

string s = "AA_x0042_x005F_x00FF_x0043_BB"; 
foreach (Match match in Regex.Matches(s, "(?<!_x005F)_x(?!005F)[0-9A-F]{4}_")) 
{ 
    Console.WriteLine(match.Value); 
} 

출력 :

 
_x0042_ 
_x0043_ 

온라인으로 작업을 참조하십시오 ideone

+0

문자열 리터럴의 리터럴 백 슬래시처럼 '_x005F_' 자체는 항상 이스케이프되어야합니다 (예 :'_x005F_x005F_')라고 가정하는 것 같습니다. 그러나이 구문은'_x005F_'가 단독으로 존재하는 것을 허용합니다. –

+0

어쨌든, 샘플 문자열에서 나는'_x0042_'과'_x00FF_'와 일치해야한다고 생각합니다. '_x005_'는 밑줄이'_x0042_'의 일부이기 때문에 이스케이프 문자가 아니며 첫 번째'_'는'_x00FF_'에 속하기 때문에'_x0043_'는 16 진수가 아닙니다. –

0

당신은 부정적인 lookbehind를 사용해야합니다. 이처럼 :

(?<!_x005F)_x[0-9A-F]{4}_ 
+0

누군가 게시하면서 질문을 수정했습니다 :) 필요에 따라 밑줄을 추가하거나 제거하십시오. – rslite

+0

이것은 작동하지 않습니다. 부정적인 lookbehind를 사용해야합니다. – detunized

+0

죄송합니다. – rslite

1

수정 대답

(?<!_x005F)x[0-9A-F]{4}_ 

편집

0

[^(_x005F)]으로 수행하려는 작업은 음수 검색 결과 : (?<!_x005F)이어야합니다. 그러나 실제로 작동하지 않습니다. Mark Byers가 지적했듯이 _x005F_x00FF_과 같은 이스케이프 처리 된 16 진수 시퀀스의 선두 인 _x005F_과 잘못 일치합니다.

그러나 Mark 's 솔루션에 부정적인 lookahead가 추가되어 작동하지 않습니다. 내가 대답 한 내용에 대한 설명 에서처럼 잘못된 텍스트는 동기화되지 않은 것처럼 보입니다. 16 진수/이스케이프 시퀀스와 동기화 상태를 유지하는 유일한 방법은 사이의 사이의 이스케이프 처리되지 않은 16 진수 시퀀스도 일치시키고 원하는 부분을 추출하는 캡처 링 그룹을 사용하는 것입니다. 이 정규식은 나를 위해 작동합니다 :

\G(?>(?>(?:(?!_x[0-9A-F]{4}_).)+|_x005F_x[0-9A-F]{4}_)*)(_x[0-9A-F]{4}_) 

나는 그것이 끔찍한 것처럼 보이지만 나와 곰. :

  • \G 앵커 첫 번째 반복에서 문자열의 시작에 경기, 마지막 경기는 이후 종료 위치로 : D 여기에 고장입니다.

  • (?:(?!_x[0-9A-F]{4}_).)+ 반복적 룩어가 16 진수 시퀀스의 첫 번째 캐릭터의 판단 않는 임의의 문자를 소비한다.

  • _x005F_x[0-9A-F]{4}_은 이스케이프 된 16 진수 시퀀스를 사용합니다.

  • (?>(?:(?!_x[0-9A-F]{4}_).)+|_x005F_x[0-9A-F]{4}_)*은 최대한 많은 횟수를 반복합니다. 가 종료되면, 다음 일은 (_x[0-9A-F]{4}_)

  • ...에 의해 그룹 # 1에 캡처됩니다 문자열 또는 이스케이프 진수 시퀀스의 마지막되어야하며 여기에 online demo입니다 의 출력은 다음과 같습니다

    abc_x0011_def_x005F__x0022_ghi_x005F_x0033_jkl_x0042_x005F_x00FF_x0043_mno 
        ^^^^^^^ ^^^^^^^^^^^^^^     ^^^^^^^  ^^^^^^^   
    
    _x0011_ 
    _x005F_ 
    _x0022_ 
    _x0042_ 
    _x00FF_ 
    

    첫 번째 _x005F_ 때문에 후행 밑줄의 다음 _x0022_을 탈출하지 않습니다. 그렇게 혼자 서 있어도 괜찮은지 모르겠지만 왜 그렇게해서는 안되는 지 알 수 없습니다. 다음 _x005F일 경우_x0033_에서 탈출합니다.

    나머지 샘플은 내가 Mark의 해결책에 대해 잘못 생각한 것을 보여줍니다. 그러나 그것이 잘못되었다는 것은 나 일 수있다. 내가하고있는 언어의 전체 구문을 모른다.