C# 请帮助修改此正则表达式
可能重复:C# 请帮助修改此正则表达式,c#,.net,regex,C#,.net,Regex,可能重复: 我正在尝试搜索以下HTML字符串以获取这些产品的成本: <div id=menu> <p>A hamburger without cheese costs $5.</p> <p>A cheeseburger with one patty costs $6.</p> </div> 一个没有奶酪的汉堡包要5美元 一个芝士汉堡加一个馅饼要6美元 我能够使用以下表达式成功获得每种商品的价格: string
我正在尝试搜索以下HTML字符串以获取这些产品的成本:
<div id=menu>
<p>A hamburger without cheese costs $5.</p>
<p>A cheeseburger with one patty costs $6.</p>
</div>
一个没有奶酪的汉堡包要5美元
一个芝士汉堡加一个馅饼要6美元
我能够使用以下表达式成功获得每种商品的价格:
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 "--";
}
string hamburger=“A hamburger[^\\\$]+\\$(?*?)。”;
string cheeseburger=“A cheeseburger[^\\\$]+\\\$(?*?)。”
公共字符串GetProductPrice(字符串表达式)
{
expression=Regex.Unescape(表达式);
正则表达式正则表达式=新正则表达式(表达式);
MatchCollection mc=regex.Matches(菜单分区字符串);
如果(mc.Count>0&&mc[0].Groups.Count==2)
返回mc[0]。组[1]。ToString();
其他的
返回“-”;
}
但是,当给出以下内容时,我被抛出了一个循环:
<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>
一个没有奶酪的汉堡包要5美元
一个芝士汉堡加一个馅饼要6美元
一个芝士汉堡(特价:加一块肉饼,每块1美元)售价6美元
第二个美元符号“为1美元再添一块肉饼”的出现让我大吃一惊。我已经研究并尝试了很多事情,比如使用模式,现在我完全弄糊涂了
是否有一个正则表达式可以计算出一个奶酪汉堡的价格,无论是否有特殊的奶酪汉堡?否..否..否.. 正则表达式不是解析HTML文件的好选择 HTML不严格,格式也不规则 使用 正则表达式用于正则表达式而不是不正则表达式 您可以使用此代码像这样检索它
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;
}
}
HtmlDocument doc=新的HtmlDocument();
文档加载(yourStream);
var itemList=doc.DocumentNode.SelectSingleNode(//div[@id='menu'])
.要素(“p”)
.Select(p=>p.InnerText)
.ToList();
foreach(itemList中的变量项)
{
Match m=Regex.Match(项,@“(?[Aa]?\s**?)\s.*(?\$\d+).*);
如果(m.Success==true)
{
m、 组[“名称”]。值;
m、 组[“价格”]。价值;
}
}
正则表达式将是
(?[Aa]?\s**?)\s.*(?\$\d+).*
Group1捕获名称
第2组捕获价格 正则表达式不是解析HTML文件的好选择 HTML不严格,格式也不规则 使用 正则表达式用于正则表达式而不是不正则表达式 您可以使用此代码像这样检索它
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;
}
}
HtmlDocument doc=新的HtmlDocument();
文档加载(yourStream);
var itemList=doc.DocumentNode.SelectSingleNode(//div[@id='menu'])
.要素(“p”)
.Select(p=>p.InnerText)
.ToList();
foreach(itemList中的变量项)
{
Match m=Regex.Match(项,@“(?[Aa]?\s**?)\s.*(?\$\d+).*);
如果(m.Success==true)
{
m、 组[“名称”]。值;
m、 组[“价格”]。价值;
}
}
正则表达式将是
(?[Aa]?\s**?)\s.*(?\$\d+).*
Group1捕获名称
Group2捕获价格用正则表达式解析html很麻烦。使用下面回答的HTMLAgilityPack-迄今为止最简单的解决方案我编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。用正则表达式解析html是很麻烦的。按照下面的回答使用HTMLAgilityPack-到目前为止,这是最简单的解决方案我编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。好的,使用正则表达式解析html不是一件好事。但是你如何解析一个奶酪汉堡(特价:每一个加一块1美元的肉饼)的价格是6美元。用HtmlAgilityPack来获得价格?+1“不规则表达”哈哈哈!好的,谢谢。我确实查看了codeplex上的HTMLAgilityPack(应该提到)站点,但没有看到任何解析html标记内部文本的示例。这个例子很有帮助。谢谢@Anirudha唯一的问题是您的linq代码无法编译。@Anirudha为什么不试试?你希望我修复它吗?好的,使用正则表达式解析html不是一件好事。但是你如何解析一个奶酪汉堡(特价:每一个加一块1美元的肉饼)的价格是6美元。用HtmlAgilityPack来获得价格?+1“不规则表达”哈哈哈!好的,谢谢。我确实查看了codeplex上的HTMLAgilityPack(应该提到)站点,但没有看到任何解析html标记内部文本的示例。这个例子很有帮助。谢谢@Anirudha唯一的问题是您的linq代码无法编译。@Anirudha为什么不试试?你希望我把它修好吗?