2013-01-23 2 views
-2
를 제거

가능한 중복 :
Using C# regular expressions to remove HTML tags정규 표현식 - 태그

내가 태그를 제거하고 XML 파일의 다른 모든 정보를 보관해야합니다. 나는 정규 표현식을 사용할 때 어떻게 든 상실감에 처한다. 필자는 파일을 한 줄씩 읽은 다음 모든 태그를 찾아 "빈 문자열"로 바꾸려고했습니다. 그러나, 예상대로 작동되지 않습니다.

line = Regex.Replace(line, "<.*>", ""); 

내가 설명을 얻을시겠습니까이 예상 작동하지 않습니다 같은 이유 (난 그냥 또한, 수> < 안에있는 문자의 모든 가능한 조합을 찾을해야한다고 생각 정규 표현식에 대한 좋은 소개를 권유합니다. 정규 표현식에서 많은 것을 읽었습니다. 그러나 어떻게 든 불완전하고 혼란 스럽습니다.

+3

xml 파서를 사용하지 않는 이유는 무엇입니까? – I4V

+1

그리고 정확히 무엇을 남기고 싶습니까? '<' and '>'을 제외하고 모두? 속성 뒤에 남겨두기? CDATA와 XText 뒤에 남겨 두시겠습니까? – user7116

+0

XML 파일에서'<>'를 제거 하시겠습니까? 뭔가 당신이 최적의 접근법에 있지 않다는 것을 말해줍니다. –

답변

6

다음과 일치하도록 * 한정사를 게으름 뱅크로 설정해야합니다. 마지막 :

line = Regex.Replace(line, "<.*?>", ""); 
2

XML을 정규 표현식으로 구문 분석하려고하는 것 외에도 (누군가 다른 사람이 그 링크를 게시 할 것임에 틀림 없다) 문제는 *이다. 욕심이이다. 문서의 첫 번째 <과 마지막 > 사이에 최대한 일치합니다. 예를 들어

,이 경우 :

<someTag>some stuff 

그 다음은 잘 작동 할 것입니다.

이있다 그러나 경우 :

<someTag>some stuff</someTag> 

은 그 다음 첫 번째 < 마지막 > 일치 따라서 태그 사이의 내용을 제거 할 수 있습니다. BlackBear가 제안

하나의 솔루션으로,이 비 욕심 만들기 위해 *?를 추가하는 것입니다. 이렇게하면 가장 큰 것 대신 가능한 가장 작은 일치를 찾습니다.

그러나 I4V에서 설명한 것처럼 XML 파서를 사용하여 XML을 구문 분석하는 것이 더 나은 솔루션입니다.

1

왜 XML 파서를 사용해야 할 때 정규식과 시간을 낭비해야합니까?

using (var reader = XmlReader.Create("file.xml")) 
{ 
    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
     case XmlNodeType.Text: 
     case XmlNodeType.CDATA: 
     case XmlNodeType.EntityReference: 
     case XmlNodeType.Whitespace: 
     case XmlNodeType.SignificantWhitespace: 
      Console.Write("{0}", reader.ReadContentAsString()); 
      break; 
     } 
    } 
} 
+0

간단한 한 줄짜리 코드로 그렇게 복잡한 코드로 시간을 낭비하는 이유는 무엇입니까? ;) – BlackBear

+0

@BlackBear : 정규 표현식은 이러한 문제에 대해 게으르고 일반적으로 잘못된 "해결책"이기 때문에. 여러 줄에 걸쳐있는 XML 요소에 대한 현재 응답은 모두 실패합니다. – user7116

+0

그래, 농담 이었어.)하지만 전체 XML 파서를 사용하는 것은 잔인한 행위 일 수 있습니다. 무엇을하고 싶은지에 따라 달라집니다. – BlackBear