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>

“以 1 美元添加第二个肉饼”中出现的第二个美元符号让我陷入了一个循环。我已经研究并尝试了很多事情,比如使用模式,在这一点上我完全搞糊涂了。

是否有一个正则表达式可以找出一个芝士汉堡的成本是否有特殊的?

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 回答