繁体   English   中英

为什么我的Regex表达式不起作用?

[英]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号。 但是我不知道,为什么使用此正则表达式找不到任何东西,而记事本++却找到每个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']"我们只收集具有等于num class属性值的span标签。 使用if (val.ToCharArray().All(p => Char.IsDigit(p)) && val.Length >= 4 && val.Length <= 10)我们检查内部文本是否全部为数字并且其长度是否4至10

仅包含示例字符串的结果:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM