Re[7]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 11:12
Оценка: 3 (1) +1
Здравствуйте, diatlov, Вы писали:

D>А почему, собственно, я не могу использовать многостроковый режим?


Ну путь будет мультилайн, только паттерн на этот измените — у меня работает

pattern = "<TR>\\s*" +
                "<TD[^>]*>\\s*" +
                //получаем номер лота
                "<B>([^<]*)</B>\\s*" +
                "<IMG[^>]*>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>\\s*" +
                "<A[^>]*>\\s*" +
                //получаем ссылку на лот и имя лота
                "<A\\s+HREF\\s*=\\s*\"([^\"]*)\">([^<]*)(<I>)?([^<]*)(</I>)?([^<]*)</A>\\s*" +
                "</A>\\s*" +
                "</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>[^<]*(<FONT)?[^<]*(<I)?[^<]*(</I)?[^<]*(</FONT)*[^<]*</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<A[^>]*>([^<]*)</A>\\s*" +
                "<BR>\\s*" +
                "</TD>\\s*<TR>\\s*" +
                "<TD\\s[^>]+>\\s*" + "((\\Z*.*)" +
                "<IMG\\s[^>]+>\\s*" +
                "<BR>([^<]*(<I>[^<]*</I>|<B>[^<]*</B>))*)*";
Поймете смысл — найдутся слова.
Катон.
Re[4]: Регулярное выражение зависает
От: WolfHound  
Дата: 15.06.07 12:37
Оценка: 3 (1)
Здравствуйте, SlaVVVa, Вы писали:

D>>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?

SVV>да как очень просто — представляешь сколько вариантов оно перелопачивает!
SVV>я вообще удивляюсь как они так быстро работают!
Долго по тому что умники писавшие regexp'ы использовали недетерминированные конечные автоматы.
Если бы они хоть немного напряглись и построели детерминированный конечный автомат то регулярные выражения работали бы действительно бфстро и никогда бы не висли.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Регулярное выражение зависает
От: diatlov Молдова  
Дата: 14.06.07 20:42
Оценка:
Ребята.. помогите пожалуйста.
Вот пример данных которые мне надо обработать:


<TR>
<TD ROWSPAN=2 VALIGN=MIDDLE ALIGN=MIDDLE BGCOLOR=#CCCCCC>
<B>4</B>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=2 HEIGHT=1>
</TD>
<TD VALIGN=TOP>
<B>
<A NAME="lot4">
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6</A>
</A>
</B>
</TD>
<TD VALIGN=TOP NOWRAP>
<B>VG<FONT CLASS="tinytext"> to </FONT>F</B>
</TD>
<TD ROWSPAN=2 VALIGN=TOP ALIGN=RIGHT>
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">$190.00</A>
<BR>
</TD>
<TR>
<TD COLSPAN=2 VALIGN=TOP>
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">
<IMG SRC="http://www.stacksarchive.com/gallery/ST1104/00/ST11040004t1.jpg" width="99" height="50" ALT="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." TITLE="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." BORDER=0 ALIGN=LEFT HSPACE=7>
</A>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=3>
<BR>Very Good to Fine. 100.6 grains. Medium golden brown with darker color residing in deep planchet flaws, traces of pitting. Obverse shows full sun face and trees, plow and date. Reverse detail is much softer with
<I>DECIMA</I> wholly gone.
</TD>
<!--<TR STYLE="background-color: #fae6e6"><TD COLSPAN=4 STYLE="font-size: 11px;" ALIGN=MIDDLE><B></B></TD>-->
<TR>
<TD COLSPAN=4>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD BGCOLOR=#C0C0C0>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=1>
</TD>
</TR>
</TABLE>
</TD>


У меня имеется следующий шаблон рег. выражения:

                                    '<TR>\\s*'+
                                '<TD[^>]*>\\s*'+
                                //получаем номер лота
                                '<B>([^<]*)</B>\\s*'+
                                '<IMG[^>]*>\\s*'+
                                '</TD>\\s*'+
                                '<TD[^>]*>\\s*'+
                                '<B>\\s*'+
                                '<A[^>]*>\\s*'+
                                //получаем ссылку на лот и имя лота                                                              '<A\\s+HREF\\s*=\\s*"([^"]*)">([^<]*)(<I>)?([^<]*)(</I>)?([^<]*)</A>\\s*'+
                                '</A>\\s*'+
                                '</B>\\s*'+
                                '</TD>\\s*'+
                                '<TD[^>]*>\\s*'+
                                '<B>[^<]*(<FONT)?[^<]*(<I)?[^<]*(</I)?[^<]*(</FONT)*[^<]*</B>\\s*'+
                                '</TD>\\s*'+
                                '<TD[^>]*>\\s*'+
                                '<A[^>]*>([^<]*)</A>\\s*'+
                                '<BR>\\s*'+
                                '</TD>\\s*<TR>\\s*'+
                                '<TD\\s[^>]+>\\s*'+
                             '<IMG\\s[^>]+>\\s*'+
                                '<BR>([^<]*((<I>|<B>)|(</I>|</B>)))*'


При его выполнении прога виснет.
Если убрать последние 2 строки то все выполняется отлично.
Если убрать 2 строки и прибавить к выражению 2 символа: '<I' то все снова виснет..
Понять в чем проблема не могу.
Помогите пожалуйста.
Re: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 07:37
Оценка:
Здравствуйте, diatlov, Вы писали:

Здравствуйте, diatlov, Вы писали:

D>При его выполнении прога виснет.

не виснет, а долго ищет!

D>Если убрать последние 2 строки то все выполняется отлично.

и с ними выполняется, но ничего не находит!

D>Если убрать 2 строки и прибавить к выражению 2 символа: '<I' то все снова виснет..

см.выше

D>Понять в чем проблема не могу.

Проблема проста по шаблону не может быть ничего найдено.

шаблон без двух послдених строк ищет по вашему примеру выделенное:



<TR>
<TD ROWSPAN=2 VALIGN=MIDDLE ALIGN=MIDDLE BGCOLOR=#CCCCCC>
<B>4</B>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=2 HEIGHT=1>
</TD>
<TD VALIGN=TOP>
<B>
<A NAME="lot4">
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6</A>
</A>
</B>
</TD>

<TD VALIGN=TOP NOWRAP>
<B>VG<FONT CLASS="tinytext"> to </FONT>F</B>
</TD>

<TD ROWSPAN=2 VALIGN=TOP ALIGN=RIGHT>
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">$190.00</A>
<BR>
</TD>
<TR>
<TD COLSPAN=2 VALIGN=TOP>

<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">
<IMG SRC="http://www.stacksarchive.com/gallery/ST1104/00/ST11040004t1.jpg" width="99" height="50" ALT="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." TITLE="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." BORDER=0 ALIGN=LEFT HSPACE=7>
</A>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=3>
<BR>Very Good to Fine. 100.6 grains. Medium golden brown with darker color residing in deep planchet flaws, traces of pitting. Obverse shows full sun face and trees, plow and date. Reverse detail is much softer with
<I>DECIMA</I> wholly gone.
</TD>
<!--<TR STYLE="background-color: #fae6e6"><TD COLSPAN=4 STYLE="font-size: 11px;" ALIGN=MIDDLE><B></B></TD>-->
<TR>
<TD COLSPAN=4>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD BGCOLOR=#C0C0C0>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=1>
</TD>
</TR>
</TABLE>
</TD>


измените шаблон на этот:


pattern = "<TR>\\s*" +
                "<TD[^>]*>\\s*" +
                //получаем номер лота
                "<B>([^<]*)</B>\\s*" +
                "<IMG[^>]*>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>\\s*" +
                "<A[^>]*>\\s*" +
                //получаем ссылку на лот и имя лота
                "<A\\s+HREF\\s*=\\s*\"([^\"]*)\">([^<]*)(<I>)?([^<]*)(</I>)?([^<]*)</A>\\s*" +
                "</A>\\s*" +
                "</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>[^<]*(<FONT)?[^<]*(<I)?[^<]*(</I)?[^<]*(</FONT)*[^<]*</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<A[^>]*>([^<]*)</A>\\s*" +
                "<BR>\\s*" +
                "</TD>\\s*<TR>\\s*" +
                "<TD\\s[^>]+>\\s*" + ".*" + // добавлено мной 
                "<IMG\\s[^>]+>\\s*" +
                "<BR>([^<]*(<I>[^<]*</I>|<B>[^<]*</B>))*";  // изменено мной


и будет найдено:


<TR>
<TD ROWSPAN=2 VALIGN=MIDDLE ALIGN=MIDDLE BGCOLOR=#CCCCCC>
<B>4</B>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=2 HEIGHT=1>
</TD>
<TD VALIGN=TOP>
<B>
<A NAME="lot4">
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6</A>
</A>
</B>
</TD>

<TD VALIGN=TOP NOWRAP>
<B>VG<FONT CLASS="tinytext"> to </FONT>F</B>
</TD>

<TD ROWSPAN=2 VALIGN=TOP ALIGN=RIGHT>
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">$190.00</A>
<BR>
</TD>

<TR>
<TD COLSPAN=2 VALIGN=TOP>
<A HREF="viewlot.php?auction=ST1104&lot=4&auclink=aHR0cDovL3d3dy5zdGFja3NhcmNoaXZlLmNvbS92aWV3Y2F0LnBocD9hdWN0aW9uPVNUMTEwNCNsb3Q0">
<IMG SRC="http://www.stacksarchive.com/gallery/ST1104/00/ST11040004t1.jpg" width="99" height="50" ALT="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." TITLE="1786 Vermont. Landscape type. VERMONTENSIUM. Ryder 6. Very Good to Fine. 100.6 grains. Medium golden..." BORDER=0 ALIGN=LEFT HSPACE=7>
</A>

<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=3>
<BR>Very Good to Fine. 100.6 grains. Medium golden brown with darker color residing in deep planchet flaws, traces of pitting. Obverse shows full sun face and trees, plow and date. Reverse detail is much softer with
<I>DECIMA</I>
wholly gone.



</TD>
<!--<TR STYLE="background-color: #fae6e6"><TD COLSPAN=4 STYLE="font-size: 11px;" ALIGN=MIDDLE><B></B></TD>-->
<TR>
<TD COLSPAN=4>
<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD BGCOLOR=#C0C0C0>
<IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=1 HEIGHT=1>
</TD>
</TR>
</TABLE>
</TD>

Поймете смысл — найдутся слова.
Катон.
Re[2]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 07:51
Оценка:
Огромное спасибо!
Очень признателен..
Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?
Re[2]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 08:28
Оценка:
Извините, но я только что проверил, и снова программа наглухо виснет.. Если бы она ничего не нашла, то выдала бы мне об этом сообщение.. Она не выходит из функции Matches. Возможно что это из-за 2го фреймворка, хотя не знаю.Такое ощущение, что у рег. выражения какой-то лимит на количество знаков в нем.. у бираю несолько символов и все работает.. Вы писали, что она у меня просто ничего не находит, поэтому и виснет.. На самом деле тот шаблон абсолютно верен. Она виснет при добавлении БУКВАЛЬНО ОДНОГО символа!
Re[3]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 08:30
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?

да как очень просто — представляешь сколько вариантов оно перелопачивает! я вообще удивляюсь как они так быстро работают!
ну не знаю у меня искала долго (около минуты) но поиск заканчивался.
Поймете смысл — найдутся слова.
Катон.
Re[3]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 08:32
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Извините, но я только что проверил, и снова программа наглухо виснет.. Если бы она ничего не нашла, то выдала бы мне об этом сообщение.. Она не выходит из функции Matches. Возможно что это из-за 2го фреймворка, хотя не знаю.Такое ощущение, что у рег. выражения какой-то лимит на количество знаков в нем.. у бираю несолько символов и все работает.. Вы писали, что она у меня просто ничего не находит, поэтому и виснет.. На самом деле тот шаблон абсолютно верен. Она виснет при добавлении БУКВАЛЬНО ОДНОГО символа!


пришлите код посмотрим!
Поймете смысл — найдутся слова.
Катон.
Re[3]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 08:34
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Извините, но я только что проверил, и снова программа наглухо виснет.. Если бы она ничего не нашла, то выдала бы мне об этом сообщение.. Она не выходит из функции Matches. Возможно что это из-за 2го фреймворка, хотя не знаю.Такое ощущение, что у рег. выражения какой-то лимит на количество знаков в нем.. у бираю несолько символов и все работает.. Вы писали, что она у меня просто ничего не находит, поэтому и виснет.. На самом деле тот шаблон абсолютно верен. Она виснет при добавлении БУКВАЛЬНО ОДНОГО символа!



вот мой код. ничего не виснет. Пример ваш получаю из файла.

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = "";
            pattern = "<TR>\\s*" +
                "<TD[^>]*>\\s*" +
                //получаем номер лота
                "<B>([^<]*)</B>\\s*" +
                "<IMG[^>]*>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>\\s*" +
                "<A[^>]*>\\s*" +
                //получаем ссылку на лот и имя лота
                "<A\\s+HREF\\s*=\\s*\"([^\"]*)\">([^<]*)(<I>)?([^<]*)(</I>)?([^<]*)</A>\\s*" +
                "</A>\\s*" +
                "</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<B>[^<]*(<FONT)?[^<]*(<I)?[^<]*(</I)?[^<]*(</FONT)*[^<]*</B>\\s*" +
                "</TD>\\s*" +
                "<TD[^>]*>\\s*" +
                "<A[^>]*>([^<]*)</A>\\s*" +
                "<BR>\\s*" +
                "</TD>\\s*<TR>\\s*" +
                "<TD\\s[^>]+>\\s*" + ".*" + 
                "<IMG\\s[^>]+>\\s*" +
                "<BR>([^<]*(<I>[^<]*</I>|<B>[^<]*</B>))*";

            //pattern = "[<]IMG\\s[^>]+[>]\\s*" +
            //    "[<]BR[>]([^<]*([<]I[>][^<]*[<]/I[>]|[<]B[>][^<]*[<]/B[>]))*";

            System.IO.FileStream fileStraem = new System.IO.FileStream(@"C:\aaa.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read);
            byte[] buffer = new byte[fileStraem.Length];
            fileStraem.Read(buffer, 0, buffer.Length);
            string text = Encoding.ASCII.GetString(buffer);

            Regex reg = new Regex(pattern, RegexOptions.Singleline);
            MatchCollection m = reg.Matches(text);

            if (m.Count > 0)
                Console.WriteLine("success");
            else
                Console.WriteLine("nothing");

            string s = m.ToString();
            Console.Read();
        }
    }
}
Поймете смысл — найдутся слова.
Катон.
Re[4]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 08:50
Оценка:
Вот кусок на C#, который выполняет выражение:

//выдача результатов регулярного выражения
        public string[][] regExec(string pattern, string text)
        {
            string[][] result = null;
            MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
            if (mc.Count > 0)
                result = new string[mc.Count][];
            for (int i = 0; i < mc.Count; i++)
            {
                result[i] = new string[mc[i].Groups.Count];
                for (int j = 0; j < mc[i].Groups.Count; j++)
                    result[i][j] = mc[i].Groups[j].ToString();
            }
            return result;
        }


А вот кусок скрипта, который мой движок обрабатывает:

function parseAuction(aURL:String)
{
    outMsg('Парсим аукцион по адресу '+aURL);
    var fS:String = safeLoad(aURL);
    if(fS == '')
    {
        outMsg('Аукцион не скачивется.. пропускаем');
    }
    else
    {
        var fAr:String[][] = coin.regExec(
                '<TR>\\s*' +
                '<TD[^>]*>\\s*' +
                //получаем номер лота
                '<B>([^<]*)</B>\\s*' +
                '<IMG[^>]*>\\s*' +
                '</TD>\\s*' +
                '<TD[^>]*>\\s*' +
                '<B>\\s*' +
                '<A[^>]*>\\s*' +
                //получаем ссылку на лот и имя лота
                '<A\\s+HREF\\s*=\\s*\"([^\"]*)\">([^<]*)(<I>)?([^<]*)(</I>)?([^<]*)</A>\\s*' +
                '</A>\\s*' +
                '</B>\\s*' +
                '</TD>\\s*' +
                '<TD[^>]*>\\s*' +
                '<B>[^<]*(<FONT)?[^<]*(<I)?[^<]*(</I)?[^<]*(</FONT)*[^<]*</B>\\s*' +
                '</TD>\\s*' +
                '<TD[^>]*>\\s*' +
                '<A[^>]*>([^<]*)</A>\\s*' +
                '<BR>\\s*' +
                '</TD>\\s*<TR>\\s*' +
                '<TD\\s[^>]+>\\s*' + '.*' + // добавлено мной 
                '<IMG\\s[^>]+>\\s*' +
                '<BR>([^<]*(<I>[^<]*</I>|<B>[^<]*</B>))*'  // изменено мной
                                , fS);
       coin.printLn('найдено '+fAr.Length+' совпадений');
       for(var i = 0; i < fAr.Length; i++)
        outMsg('лот '+fAr[i][1]);
    }
}


Аукцион берется например такой:
http://www.stacksarchive.com/viewcat.php?auction=ST1104

Если что — вот моя аська: 488880111
Re[5]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 09:34
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Вот кусок на C#, который выполняет выражение:


D>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);

измените на — RegexOptions.Singleline
Поймете смысл — найдутся слова.
Катон.
Re[5]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 09:52
Оценка:
Здравствуйте, diatlov, Вы писали:

Singleline — Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n). — вот что говорит об этот параметре MSDN.

Нам он нужет чтобы вот здесь:

"<TD\\s[^>]+>\\s*" + ".*" + выделенное могло и переходы на следующую строку захватывать.
Поймете смысл — найдутся слова.
Катон.
Re: Регулярное выражение зависает
От: Аноним  
Дата: 15.06.07 09:52
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Ребята.. помогите пожалуйста.

D>Вот пример данных которые мне надо обработать:
D>

D><TR>
D><TD ROWSPAN=2 VALIGN=MIDDLE ALIGN=MIDDLE BGCOLOR=#CCCCCC>
D> <B>4</B>
D> <IMG SRC="http://www.stacksarchive.com/1pixel.gif" BORDER=0 ALT="" TITLE="" WIDTH=2 HEIGHT=1>
D></TD>
D>

D>У меня имеется следующий шаблон рег. выражения:

D>[java]

D> '<TR>\\s*'+
D>При его выполнении прога виснет.


Зачем так усложнять жизнь себе. Разбейте ваш текст по тегу TR, TD, а потом достанете из i-й строчки нужные данные.

--
Владимир
Re[6]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 10:08
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

SVV>Здравствуйте, diatlov, Вы писали:


D>>Вот кусок на C#, который выполняет выражение:


D>>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);

SVV>измените на — RegexOptions.Singleline

Для SingleLine работает, но находит из 30 только по одному совпадению для каждой страницы.
Re[6]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 10:26
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

SVV>Здравствуйте, diatlov, Вы писали:


SVV>Singleline — Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n). — вот что говорит об этот параметре MSDN.


SVV>Нам он нужет чтобы вот здесь:


SVV>"<TD\\s[^>]+>\\s*" + ".*" + выделенное могло и переходы на следующую строку захватывать.



А почему, собственно, я не могу использовать многостроковый режим?
Re[6]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 10:30
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

SVV>Здравствуйте, diatlov, Вы писали:


D>>Вот кусок на C#, который выполняет выражение:


D>>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);

SVV>измените на — RegexOptions.Singleline

Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.
Re[7]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 11:16
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Для SingleLine работает, но находит из 30 только по одному совпадению для каждой страницы.


вернее все 30 в одном!
Поймете смысл — найдутся слова.
Катон.
Re[7]: Регулярное выражение зависает
От: SlaVVVa Россия  
Дата: 15.06.07 11:17
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.

точно вам говорю это не вис, это процесс оптимизации
по крайней мере так говорит отладчик
Поймете смысл — найдутся слова.
Катон.
Re[8]: Регулярное выражение зависает
От: diatlov Молдова  
Дата: 15.06.07 14:13
Оценка:
Огромное спасибо!!!
Теперь наконец-то заработало!
Казалось-бы рег. выражение стало больше, но теперь почему-то не оптимизируется
Странные они какие-то.. Оказывается правильное рег. выражение нужно записывать ещё правильнее .. По-моему у них что-то не в порядке с этой библиотекой.

Ещё раз спасибо!
Re[7]: Регулярное выражение зависает
От: Eugeny__ Украина  
Дата: 22.06.07 12:58
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.


Почитайте кижку по регекспам.

Вложенные символьные классы(а особенно "широкие", типа точки) с модифкаторами * и + без явных якорей(или с расплывчатыми/часто совпадающими якорями) есть то, что следует избегать. На вскидку не вспомню, но выражение всего из 10 символов при поиске на строке из 20 может дать "подвисание"(а строго говоря, время выполнения несколько часов).
Вобщем, это лучше правда почитать.

А на данный случай — не проще ли разбить поиск на несколько частей? Выражение уж сильно монструозное, несколько более простых облегчили бы задацу, ИМХО.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[7]: Регулярное выражение зависает
От: Eugeny__ Украина  
Дата: 22.06.07 13:02
Оценка:
Здравствуйте, diatlov, Вы писали:

D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.


Да, еще. Старайтесь не использовать запоминающие скобки там, где они не нужны. Это тоже сильно на скорость влияет.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[3]: Регулярное выражение зависает
От: Eugeny__ Украина  
Дата: 22.06.07 13:45
Оценка:
Здравствуйте, diatlov, Вы писали:
.
D>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?

Выражение "(.*?)*" надолго оставит в задумчивости движок регекспа даже на 20 символах во входящей строке
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.