1

重複の可能性:
正規表現は、XHTML自己完結型タグを除くオープンタグと一致します

これらの製品のコストを取得するために、次のHTML文字列を検索しようとしています。

<div id=menu>
  <p>A hamburger without cheese costs $5.</p>
  <p>A cheeseburger with one patty costs $6.</p>
</div>

次の式を使用して、各アイテムの価格を取得することができました。

string hamburger = "<p>A hamburger[^\\$]+\\$(?<price>.*?).</p>";
string cheeseburger = "<p>A cheeseburger[^\\$]+\\$(?<price>.*?).</p>"

    public string GetProductPrice(string expression)
    {
        expression = Regex.Unescape(expression);
        Regex regex = new Regex(expression);
        MatchCollection mc = regex.Matches(MENU_DIV_STRING);

        if (mc.Count > 0 && mc[0].Groups.Count == 2)
            return mc[0].Groups[1].ToString();
        else
            return "--";
    }

しかし、これが与えられたとき、私はループを投げられました:

<div id=menu>
  <p>A hamburger without cheese costs $5.</p>
  <p>A cheeseburger with one patty costs $6.</p>
  <p>A cheeseburger (SPECIAL: add an additional patty for $1 each) costs $6.</p>
</div>

「2つ目のパティを$1で追加」の2番目のドル記号が表示されたため、完全なループが発生しました。私はパターンの使用など、さまざまなことを研究して試しましたが、この時点で私は完全に混乱しました。

特別なものがあるかどうかにかかわらず、チーズバーガーの価格を知る正規表現はありますか?

4

1 に答える 1

4

ダメダメダメ..

正規表現は、HTMLファイルの解析には適していません。

HTMLは厳密ではなく、その形式も規則的ではありません。

htmlagilitypackを使用する

正規表現は正規表現に使用されますが、不規則な表現ではありません

このコードを使用して、次のように取得できます

HtmlDocument doc = new HtmlDocument();
doc.Load(yourStream);

var itemList = doc.DocumentNode.SelectSingleNode("//div[@id='menu']")
                  .Elements("p")
                  .Select(p => p.InnerText)
                  .ToList();

foreach(var item in itemList)
{
Match m= Regex.Match(item,@"(?<name>[Aa]?\s*.*?)\s.*?(?<price>\$\d+).*");
    if(m.Success==true)
     {
            m.Groups["name"].Value;
            m.Groups["price"].Value;
     }
}

正規表現は

(?<name>[Aa]?\s*.*?)\s.*?(?<price>\$\d+).*

Group1は名前をキャプチャします

Group2が価格を取得

于 2012-10-19T19:28:57.643 に答える