2013-03-11 2 views
1

정규식을 사용하여 속성이없는 불완전한 xml 태그를 찾으려고합니다. 지금까지이 정규식 </?\s*([a-zA-Z0-9]?:\s+)?[a-zA-Z0-9]*(?!>)을 생각해 냈지만 트릭을 수행하지는 않습니다. XML 부분 하나 같이 : <abc> </abc> <ab> </ab <s:ab정규식을 사용하여 불완전한 xml 태그를 찾을 수 #

나는 (그들은 모두 말에 ">"부족해으로) </ab<s:ab을 일치합니다. C#에서 정규 표현식을 사용하여이 작업을 수행 할 수 있습니까?

+6

정규식은 적합하지 않습니다. XML 파서/유효성 검사기를 사용해야합니다. – Oded

+0

하나의 정규 표현식으로 모든 가능성을 다룰 수는 없습니다. Oded의 제안을 따르는 것이 좋습니다. – m0skit0

+0

많은 가능성이 있다고 생각하지 않습니다. 이 태그는 내가 관심있는 태그 종류입니다.

답변

0

하나의 XML 파일에서 오류를 찾으려고하면 Google 크롬 웹 브라우저에서 오류를 찾으십시오. 오류가 발생한 행이 표시됩니다.

하지만 코드로 처리해야하는 파일이 많은 경우 regexes보다 강력한 기능이 필요합니다.

1

아주 가까이 있습니다. 가장 중요한 문제는 네거티브 미리보기가 실패 할 때 패턴이 다시 추적된다는 것입니다. 비회원 그룹 인 원자 번호 그룹 (?>no backtracking in here)에서 미리보기 앞부분을 붙이면 피할 수 있습니다. 예를 들어

:이 <foo bar><foo 일치하는 것으로

(?xi)     # turn on eXtended (ignore spaces/comments) and case-Insensitive mode 
(?>      # don't backtrack 
    < /?     # tag start (no space allowed after it) 
    [a-z0-9]+    # tag name/space 
    (?: : [a-z0-9]+)? 
    \s*     # optional spaces 
) 
(?! >)     # no ending 

참고.

0

사람들이 말했듯이 XML은 정규 언어가 아니기 때문에 이것은 아마도 쓸데없는 노력 일 것입니다. 그러나 문제의 일부는 미리보기입니다. 바로 뒤에 꺽쇠 괄호가없는 것을 확인하십시오. 즉, 이 <abc> 인 것도 원하지 않을 때에도 일치합니다. 따라서 미리보기에 전체 태그 구조를 포함해야합니다.

#</?([a-z]?:)?[a-z]*(?!/?([a-z]?:)?[a-z]*>)# 

당신이 행동 here에서 볼 수 있습니다

당신이, 내가 정규 표현식을 사용할 수 준 정확한 데이터의 일치를 얻으려면. 여기에서 중요한 점은 정규 표현식 엔진이 어떤 시점에서도 역방향으로 (예를 들어, 한 문자 삭제) 선행 검사의 유효성을 검사 할 수 있는지 확인하는 것입니다. 이를 수행하는 다른 방법이 있습니다 (예 : possessive quantifiers). 정상적인 역 추적 프로세스에서 일치하는 토큰을 포기하지 않지만 표준 .NET 엔진은 소유욕 일치를 지원하지 않습니다. 동일한 방식으로 작동하지만 한정 기호 대신 그룹을 사용하는 원자 그룹을 지원합니다. 원자 그룹에있는 태그의 전체 열기를 래핑했습니다 ( here). ( (?> ...)) 당신은 어떻게 태그를 포맷해야한다고위한 당신의 자신의 정규 표현식을 자유롭게 체결 할 수있어,하지만이 정규 표현식은 이미 읽을 수있는 코드에 대한 제한을 밀고, 그리고에 대해 듣는 것을 말을해야

#(?></?([a-z]?:)?[a-z]*)(?!>)# 

legal xml 태그 이름은 그 방향으로 태그 이름을 더 밀어 넣을 것입니다. 그럼에도 불구하고, 이것이 오류에 대해 밝히는 데 도움이되기를 바랍니다.

+0

해시는 무엇입니까? 이것은 PHP가 아니므로 큰 따옴표를 사용하지 않아도됩니다. – Qtax

+0

@Qtax 구분 기호를 사용하는 Perl 호환 정규 표현식의 표준입니다. PHP가 그것을하는 유일한 언어는 아닙니다. Perl (명확하게)과 Javascript는 언어에 내장되어 있습니다 (Javascript는 슬래시 만 허용 함). – FrankieTheKneeMan

+0

여기에 이중/중첩 인용입니다. 이 어리 석음은 PHP에서만 가능합니다. 다른 언어는 정규 표현식 (Perl, JS, Ruby 등)을위한 특별한 인용 구조 (예 :'/ regex /')를 사용하거나 일반적인 문자열 인용 부호 (Java, C++ 등)를 사용합니다. Perl에서는 표현식을 인용하고 싶은 거의 모든 문자를 사용할 수 있습니다. 내 요점은 : 1) C#은 그렇게 인용하지 않는다. 2) 마크 업 표식에 이미 표현식을 인용 했으므로 다시 인용 할 필요가 없습니다 (지원되지 않는 형식 임). 3) PHP regex가 광기를 보임으로 확산시키지 마십시오. – Qtax

관련 문제