2017-04-05 3 views
0

私は自分のhtmlにネストされたul、liリストを持っています。正規表現をulノードからulノードの終わりまで取得するにはどうしたらいいですか?以下のこの例では、私は2つのマッチを取得する必要があります。正規表現のネストされたULはhtmlのC#で使用されます

まず一つは

<ul> 
    <li>This is First List</li> 
    <li>This is Second List</li> 
    <ul> 
     <li>This is Second UL First List </li> 
     <li>This is Second UL Second List </li> 
    </ul> 
    <li>This is Third List</li> 
</ul> 

すべきであり、もう一つは

<ul> 
     <li>This is Next List</li> 
     <ul> 
      <li>This is Test </li> 
     </ul> 
     <li>This is Third List</li> 
     <ul> 
      <li>This is Test </li> 
     </ul> 
</ul> 

私のHTMLコードを次のようになります。あなたが.NET Balancing Groupsでネストされた構造を一致させることができます

<html> 
<p> This is First Paragraph </p> 
<ul> 
    <li>This is First List</li> 
    <li>This is Second List</li> 
    <ul> 
     <li>This is Second UL First List </li> 
     <li>This is Second UL Second List </li> 
    </ul> 
    <li>This is Third List</li> 
</ul> 
<p> This is Second Paragraph </p> 

<ul> 
    <li>This is Next List</li> 
    <ul> 
     <li>This is Test </li> 
    </ul> 
    <li>This is Third List</li> 
    <ul> 
     <li>This is Test </li> 
    </ul> 
</ul> 
</html> 
+1

HTMLを解析するために正規表現を使用しないでください。参照してください:http://stackoverflow.com/a/1732454/4664094 –

+1

[義務的なリンク](http://stackoverflow.com/a/1732454/2307070) –

+1

あなたはHTMLアジリティパック(https://htmlagilitypack.codeplex .com)。以前のポスターで述べたように、RegExは使用しません。 –

答えて

0

。この機能は基本的にはスタックのコンセプトを追加して、(<NestedUL>...)(<-NestedUL>...)を入力し、パターンの最後に空白の先読みだけを含むパターンの最後をテストします。(?(NestedUL)(?!))

var input = 
    @"<html> 
    <p> This is First Paragraph </p> 
    <ul> 
     <li>This is First List</li> 
     <li>This is Second List</li> 
     <ul> 
      <li>nested list #1 inside first parent UL</li> 
      <li>This is Second UL Second List </li> 
     </ul> 
     <li>This is Third List</li> 
    </ul> 
    <p> This is Second Paragraph </p> 

    <ul> 
     <li>This is Next List</li> 
     <ul> 
      <li>nested list #1 inside second parent UL</li> 
     </ul> 
     <li>This is Third List</li> 
     <ul> 
      <li>nested list #2 inside second parent UL</li> 
     </ul> 
    </ul> 
    </html>"; 
       var pattern = "<ul>(?:(?<NestedUL><ul>)|(?<-NestedUL></ul>)|.)+?(?(NestedUL)(?!))</ul>"; 
       var matches = Regex.Matches(input, pattern, RegexOptions.Singleline); 
      } 

*繰り返し交互+?非貪欲数量詞の点に注意してください - これは貪欲だった場合、パターンは喜んでシングルマッチで両方のULのを消費することになります。

関連する問題