Почему это регулярное выражение C # приводит к сбою моей программы? - PullRequest
2 голосов
/ 21 марта 2010
using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;

namespace Working
{
    class Program4
    {
        static string errorurl = 
               "http://www.realtor.ca/propertyDetails.aspx?propertyId=8692663";

        static void Main(string[] args)
        {
            string s;

            s = getWebpageContent(errorurl);

            s = removeNewLineCharacters(s);

            getFields(s);

            Console.WriteLine("End");
        }


        public static void getFields(string html)
        {
            Match m;
            string fsRE = @"ismeasurement.*?>.*?(\d+).*?sqft";
            m = Regex.Match(html, fsRE, RegexOptions.IgnoreCase);
        }

        private static string removeNewLineCharacters(string str)
        {
            string[] charsToRemove = new string[] { "\n", "\r" };

            foreach (string c in charsToRemove)
            {
                str = str.Replace(c, "");
            }

            return str;
        }


        static string getWebpageContent(string url)
        {
            WebClient client = new WebClient();

            client.Headers.Add("user-agent",
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; 
                          .NET CLR 1.0.3705;)");

            Stream data = client.OpenRead(url);
            StreamReader reader = new StreamReader(data);
            string s = reader.ReadToEnd();
            data.Close();
            reader.Close();

            return s;
        }
    }
}

Эта программа зависает.Он работает правильно, когда я удаляю опцию RegexOptions.IgnoreCase или когда я удаляю вызов функции removeNewLineCharacters ().Может кто-нибудь сказать мне, что происходит, пожалуйста?

1 Ответ

2 голосов
/ 21 марта 2010
@"ismeasurement.*?>.*?(\d+).*?sqft"

Видя так много ленивых матчей, я думаю, слишком много времени уходит на возврат .

Попробуйте изменить его, чтобы не использовать ленивые совпадения, например,

@"ismeasurement[^>]*>\D*(\d+)\s*sqft"

Причина удаления RegexOptions.IgnoreCase работает потому, что на этой странице есть только строка "isMeasurement". Причина удаления removeNewLineCharacters заключается в том, что . не соответствует новым строкам, поэтому он может остановиться рано.

(Кстати, почему вы сопоставляете HTML с Regex ?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...