태그 이름으로 그룹화 된 Scecifig 태그 및 해당 컨텐츠에 대한 regex

StackOverflow https://stackoverflow.com/questions/200525

  •  03-07-2019
  •  | 
  •  

문제

입력 (XML이 아닌 HTML)은 다음과 같습니다.

... html content ...
<tag1> content for tag 1 </tag1>
<tag2> content for tag 2 </tag2>
<tag3> content for tag 3 </tag3>
... html content ...

각각 두 그룹의 3 경기를 받고 싶습니다. 첫 번째 그룹에는 태그의 이름이 포함되어 있고 두 번째 그룹에는 태그의 내부 텍스트가 포함됩니다. 이 세 가지 태그 만 있으므로 보편적 일 필요는 없습니다.

다시 말해:

match.Groups["name"] would be "tag1"
match.Groups["value"] would be "content for tag 2"

어떤 아이디어?

도움이 되었습니까?

해결책

나는 당신이 왜 경기 그룹 이름을 사용하고 싶은지 모르겠습니다.

다음은 태그 이름과 태그 컨텐츠를 번호가 매겨진 하위 일치로 일치시키는 정규 표현식입니다.

<(tag1|tag2|tag3)>(.*?)</$1>

.NET 스타일 그룹 이름이있는 변형입니다

<(?'name'tag1|tag2|tag3)>(?'value'.*?)</\k'name'>.

편집하다

Regex는 질문 저자의 설명에 따라 조정되었습니다.

다른 팁

이것에 대한 정규식은 다음과 같습니다.

/<([^>]+)>([^<]+)<\/\1>/

그러나 .NET의 탈출 마카니아에 대해 잘 모르기 때문에 그것은 일반적입니다. 번역하려면 :

  • 첫 번째 그룹은 <과> 사이의 첫 번째 태그 이름과 일치합니다.
  • 두 번째 그룹은 내용과 일치합니다 (>에서 다음으로
  • 첫 번째 태그가 닫혀 있는지 확인하십시오

HTH

REGEXES는 아무도 일하지 않지만 감사합니다. :( 어쩌면 나는 충분히 구체적이지 않았을 것입니다. 죄송합니다. 여기에 구문 분석하려는 정확한 HTML이 있습니다.

...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...

지금 더 명확 해지기를 바랍니다. 나는 사용자와 메시지 태그를 따랐다.

각각 두 개의 그룹이있는 두 개의 경기를 받아야합니다. 첫 번째 그룹은 나에게 태그 이름 (사용자 또는 메시지)을 제공하고 두 번째 그룹은 태그의 전체 내부 텍스트를 제공합니다.

데이터가 적절한 XML입니까, 아니면 그냥처럼 보입니까?

HTML이라면 HTML 민첩성 팩 조사 할 가치가 있습니다 - 이것은 데이터를 쿼리하는 데 사용할 수있는 DOM (XMLDocument와 유사)을 제공합니다.

string input = @"<html>...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...</html>";

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(input);
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//user | //message"))
            {
                Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
                // or node.InnerHtml to keep the formatting within the content
            }

이 출력 :

user:  hello mitch
message:  some html message bla

서식 태그를 원한다면 .innerText 대신 .innerHtml을 사용하십시오.

XML이라면 XML의 전체 스펙트럼으로 코딩하는 것이 XML 파서를 사용하는 것이 좋습니다. 작은 크기의 크기 XML의 경우 XMLDocument와 같은 DOM에로드하는 것이 좋습니다. 그런 다음 노드를 쿼리하십시오 (예 : "//*"). 거대한 XML의 경우 XMLReader가 옵션 일 수 있습니다.

데이터가 전체 XML에 대해 걱정할 필요가 없다면, 일부 간단한 정규식은 너무 까다 롭지 않아야합니다 ... 단순화 된 예 (속성 없음, 네임 스페이스, 중첩 된 XML 없음)는 다음과 같습니다.

string input = @"blah <tag1> content for tag 1 </tag1> blop
<tag2> content for tag 2 </tag2> bloop
<tag3> content for tag 3 </tag3> blip";

        const string pattern = @"<(\w+)>\s*([^<>]*)\s*</(\1)>";
        Console.WriteLine(Regex.IsMatch(input, pattern));
        foreach(Match match in Regex.Matches(input, pattern)) {
            Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
        }

문제는 ([^<]*) 사람들이 태그 내부의 물건에 맞는 데 사용하는 ([^<]*)가 중첩 태그의 개구부와 일치하고 중첩 태그의 닫기 태그가 외부 태그와 일치하지 않았다는 것입니다. Regex가 실패했습니다.

다음은 속성과 공백을 허용하는 Tomalak의 Regex의 약간 더 강력한 버전입니다.

Regex tagRegex = new Regex(@"<\s*(?<tag>" + string.Join("|", tags) + @")[^>]*>(?<content>.*?)<\s*/\s*\k<tag>\s*>", RegexOptions.IgnoreCase);

분명히 특정 태그 세트를 사용해야한다면 교체 할 수 있습니다.

string.Joing("|", tags)

하드 코드 파이프가 분리 된 태그 목록으로.

Regex의 제한 사항은 하나의 태그가있는 경우 다른 태그 내부에 중첩을 일치 시키려고한다는 것입니다. 외부 태그 만 일치합니다. 즉

u003Cuser>알파벳u003Cmessage> 데프u003C/message> 가이u003C/user>

외부 사용자 태그와 일치하지만 내부 메시지 태그는 아닙니다.

또한 다음과 같은 속성으로 인용 된>의 인용을 처리하지 않습니다.

u003Cuser attrib="oops>">

그것은 단지 일치 할 것입니다

u003Cuser attrib="oops>

태그와

">

태그 내용의 일부가됩니다.

이것은 당신이 원하는 것에 대한 이름의 캡처 그룹을 줄 것입니다. 그러나 중첩 태그에는 작동하지 않습니다.

/<(?<name>[^>]+)>(?<value>[^<]+)</\1>/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top