为什么我的正则表达式不起作用?
Why my Regex expression doesn't work?
我有这个程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
namespace Reviews_browser_test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(enter good, that u want to find: ");
string tovar = Console.ReadLine();
string page = "http://www.ulmart.ru/search?string=&rootCategory=&sort=6";
page = page.Insert(35, tovar); // inserts good's id into url
HttpWebRequest site = (HttpWebRequest)WebRequest.Create(page);
HttpWebResponse response = (HttpWebResponse)site.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader read = new StreamReader(dataStream);
String data = read.ReadToEnd();
Console.WriteLine(data);
System.IO.File.WriteAllText("ulmart.html", data);
Console.ReadKey();
Match m;
string pattern = "<span[^>]*?>[0-9]{4,10}</span>";
m = Regex.Match(data, pattern);
while (m.Success)
{
Console.WriteLine("Found an id " + m.Groups[1] + " at string "+ m.Groups[1].Index);
m = m.NextMatch();
}
Console.ReadKey();
}
}
}
我想从 html 文件中获取所有 ID 号。但我不知道,为什么使用这个正则表达式它找不到任何东西,而 notepad++ 发现每个 id 都很好。
html 字符串的示例,应该使用此正则表达式找到:
<span class="num">3609304</span>
我的错误在哪里?
解决问题的最佳方法是使用HtmlAgilityPack。将其安装为 NuGet 包,并使用以下方法:
public List<string> HtmlAgilityPackGetNumericSpan4to10(string html)
{
var vals = new List<string>();
HtmlAgilityPack.HtmlDocument hap;
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp)
{ // html is a URL
var doc = new HtmlAgilityPack.HtmlWeb();
hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
hap = new HtmlAgilityPack.HtmlDocument();
hap.LoadHtml(html);
}
var nodes = hap.DocumentNode.SelectNodes("//span[@class='num']");
if (nodes != null)
{
foreach (var node in nodes)
{
var val = node.InnerText;
if (val.ToCharArray().All(p => Char.IsDigit(p))
&& val.Length >= 4 && val.Length <= 10)
vals.Add(val);
}
}
return vals;
}
对于 "//span[@class='num']"
,我们仅收集 class
属性值等于 num
的 span
标签。使用 if (val.ToCharArray().All(p => Char.IsDigit(p)) && val.Length >= 4 && val.Length <= 10)
我们检查内部文本是否全是数字并且它的长度是从 4 到 10。
只有您的示例字符串的结果:
我有这个程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
namespace Reviews_browser_test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(enter good, that u want to find: ");
string tovar = Console.ReadLine();
string page = "http://www.ulmart.ru/search?string=&rootCategory=&sort=6";
page = page.Insert(35, tovar); // inserts good's id into url
HttpWebRequest site = (HttpWebRequest)WebRequest.Create(page);
HttpWebResponse response = (HttpWebResponse)site.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader read = new StreamReader(dataStream);
String data = read.ReadToEnd();
Console.WriteLine(data);
System.IO.File.WriteAllText("ulmart.html", data);
Console.ReadKey();
Match m;
string pattern = "<span[^>]*?>[0-9]{4,10}</span>";
m = Regex.Match(data, pattern);
while (m.Success)
{
Console.WriteLine("Found an id " + m.Groups[1] + " at string "+ m.Groups[1].Index);
m = m.NextMatch();
}
Console.ReadKey();
}
}
}
我想从 html 文件中获取所有 ID 号。但我不知道,为什么使用这个正则表达式它找不到任何东西,而 notepad++ 发现每个 id 都很好。 html 字符串的示例,应该使用此正则表达式找到:
<span class="num">3609304</span>
我的错误在哪里?
解决问题的最佳方法是使用HtmlAgilityPack。将其安装为 NuGet 包,并使用以下方法:
public List<string> HtmlAgilityPackGetNumericSpan4to10(string html)
{
var vals = new List<string>();
HtmlAgilityPack.HtmlDocument hap;
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp)
{ // html is a URL
var doc = new HtmlAgilityPack.HtmlWeb();
hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
hap = new HtmlAgilityPack.HtmlDocument();
hap.LoadHtml(html);
}
var nodes = hap.DocumentNode.SelectNodes("//span[@class='num']");
if (nodes != null)
{
foreach (var node in nodes)
{
var val = node.InnerText;
if (val.ToCharArray().All(p => Char.IsDigit(p))
&& val.Length >= 4 && val.Length <= 10)
vals.Add(val);
}
}
return vals;
}
对于 "//span[@class='num']"
,我们仅收集 class
属性值等于 num
的 span
标签。使用 if (val.ToCharArray().All(p => Char.IsDigit(p)) && val.Length >= 4 && val.Length <= 10)
我们检查内部文本是否全是数字并且它的长度是从 4 到 10。
只有您的示例字符串的结果: