可能重复:
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美元添加第二个小馅饼”让我完全循环。我已经研究并尝试了很多使用模式的东西,此时我完全迷惑了自己。
是否有一个正则表达式可以找出芝士汉堡的成本是否有特殊与否?
答案 0 :(得分:4)
<强> NO..NO..NO .. 强>
正则表达式不是解析HTML文件的好选择..
HTML不严格,格式也不规则..
正则表达式用于常规表达式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捕获价格