请帮忙修改这个正则表达式

时间:2012-10-19 19:27:01

标签: c# .net regex

  

可能重复:
  RegEx match open tags except XHTML self-contained tags

我正在尝试搜索以下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美元添加第二个小馅饼”让我完全循环。我已经研究并尝试了很多使用模式的东西,此时我完全迷惑了自己。

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

1 个答案:

答案 0 :(得分:4)

<强> NO..NO..NO ..

正则表达式不是解析HTML文件的好选择..

HTML不严格,格式也不规则..

使用htmlagilitypack

正则表达式用于常规表达式NOT 不规则表达式

您可以使用此代码来检索它

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捕获价格