2017-08-16 9 views
1

私はliタグの内容を抽出しようとすると、次のコードがあります。C#で複数行の正規表現に問題がありますが、これをどのように修正できますか?

 string blah = @"<ul> 
     <li>foo</li> 
     <li>bar</li> 
     <li>oof</li> 
     </ul>"; 

     string liRegexString = @"(?:.)*?<li>(.*?)<\/li>(?:.?)*"; 
     Regex liRegex = new Regex(liRegexString, RegexOptions.Multiline); 
     Match liMatches = liRegex.Match(blah); 
     if (liMatches.Success) 
     { 
      foreach (var group in liMatches.Groups) 
      { 
       Console.WriteLine(group); 
      } 
     } 
     Console.ReadLine(); 

正規表現は、はるかに簡単かつ複数行のオプションなしで始めたが、私はそれが動作するようにしようとし、それを微調整してきました。私が欲しい

foobaroof結果ではなく、私は<li>foo</li>fooを取得します。 Regex101で正常に動作するようです。この私の上に

https://regex101.com/r/jY6rnz/1

任意の考え?

+2

あなたが正規表現でHTMLを解析しようとするべきではありません。 htmlは正規ではなく、regex(正規表現)はhtmlでうまく動作しません。標準のhtml解析メソッドを使用します。 – jdweng

+1

https://stackoverflow.com/a/1732454/7931009 –

答えて

3

私はコメントで述べたように、あなたがそのようなHtmlAgilityPackなど適切なHTMLパーサとHTMLを解析する必要があると思うと言って開始します。あなたの質問に実際に答えるために動く...

liRegex.Match(blah);は1つのマッチを返すだけなので、1つのマッチが得られるという問題があります。あなたが望むのはliRegex.Matches(blah)です。これはすべてのマッチを返します。

だからあなたの使用は次のようになります。

​​
2

正規表現でblahと一致すると、正規表現で複数の一致が生成されます。 Matchメソッドは最初の一致のみを返します。これはfooです。その最初の試合ですべてのグループを印刷しています。それはあなたを得る1.全体のマッチ2.マッチのグループ1。

foobarを取得する場合は、のグループ1をそれぞれと一致させて印刷する必要があります。これを行うには、Matchesを最初に使用してすべての一致を取得する必要があります。その後MatchCollectionと印刷Groups[1]を反復:

string blah = @"<ul> 
<li>foo</li> 
<li>bar</li> 
<li>oof</li> 
</ul>"; 
string liRegexString = @"(?:.)*?<li>(.*?)<\/li>(?:.?)*"; 
Regex liRegex = new Regex(liRegexString, RegexOptions.Multiline); 
MatchCollection liMatches = liRegex.Matches(blah); 
foreach (var match in liMatches.Cast<Match>()) 
{ 
    Console.WriteLine(match.Groups[1]); 
} 
関連する問題