Здравствуйте, SlaVVVa, Вы писали:
D>>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут? SVV>да как очень просто — представляешь сколько вариантов оно перелопачивает! SVV>я вообще удивляюсь как они так быстро работают!
Долго по тому что умники писавшие regexp'ы использовали недетерминированные конечные автоматы.
Если бы они хоть немного напряглись и построели детерминированный конечный автомат то регулярные выражения работали бы действительно бфстро и никогда бы не висли.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Ребята.. помогите пожалуйста.
Вот пример данных которые мне надо обработать:
<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' то все снова виснет..
Понять в чем проблема не могу.
Помогите пожалуйста.
Здравствуйте, diatlov, Вы писали:
D>При его выполнении прога виснет.
не виснет, а долго ищет!
D>Если убрать последние 2 строки то все выполняется отлично.
и с ними выполняется, но ничего не находит!
D>Если убрать 2 строки и прибавить к выражению 2 символа: '<I' то все снова виснет..
см.выше
D>Понять в чем проблема не могу.
Проблема проста по шаблону не может быть ничего найдено.
шаблон без двух послдених строк ищет по вашему примеру выделенное:
<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>
<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.
Извините, но я только что проверил, и снова программа наглухо виснет.. Если бы она ничего не нашла, то выдала бы мне об этом сообщение.. Она не выходит из функции Matches. Возможно что это из-за 2го фреймворка, хотя не знаю.Такое ощущение, что у рег. выражения какой-то лимит на количество знаков в нем.. у бираю несолько символов и все работает.. Вы писали, что она у меня просто ничего не находит, поэтому и виснет.. На самом деле тот шаблон абсолютно верен. Она виснет при добавлении БУКВАЛЬНО ОДНОГО символа!
Здравствуйте, diatlov, Вы писали:
D>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?
да как очень просто — представляешь сколько вариантов оно перелопачивает! я вообще удивляюсь как они так быстро работают!
ну не знаю у меня искала долго (около минуты) но поиск заканчивался.
Здравствуйте, diatlov, Вы писали:
D>Извините, но я только что проверил, и снова программа наглухо виснет.. Если бы она ничего не нашла, то выдала бы мне об этом сообщение.. Она не выходит из функции Matches. Возможно что это из-за 2го фреймворка, хотя не знаю.Такое ощущение, что у рег. выражения какой-то лимит на количество знаков в нем.. у бираю несолько символов и все работает.. Вы писали, что она у меня просто ничего не находит, поэтому и виснет.. На самом деле тот шаблон абсолютно верен. Она виснет при добавлении БУКВАЛЬНО ОДНОГО символа!
Здравствуйте, 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();
}
}
}
Здравствуйте, diatlov, Вы писали:
D>Вот кусок на C#, который выполняет выражение:
D>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
измените на — RegexOptions.Singleline
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-й строчки нужные данные.
Здравствуйте, SlaVVVa, Вы писали:
SVV>Здравствуйте, diatlov, Вы писали:
D>>Вот кусок на C#, который выполняет выражение:
D>>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase); SVV>измените на — RegexOptions.Singleline
Для SingleLine работает, но находит из 30 только по одному совпадению для каждой страницы.
Здравствуйте, 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*" + ".*" + выделенное могло и переходы на следующую строку захватывать.
А почему, собственно, я не могу использовать многостроковый режим?
Здравствуйте, SlaVVVa, Вы писали:
SVV>Здравствуйте, diatlov, Вы писали:
D>>Вот кусок на C#, который выполняет выражение:
D>>MatchCollection mc = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase); SVV>измените на — RegexOptions.Singleline
Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.
Здравствуйте, diatlov, Вы писали:
D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.
точно вам говорю это не вис, это процесс оптимизации
по крайней мере так говорит отладчик
Огромное спасибо!!!
Теперь наконец-то заработало!
Казалось-бы рег. выражение стало больше, но теперь почему-то не оптимизируется
Странные они какие-то.. Оказывается правильное рег. выражение нужно записывать ещё правильнее .. По-моему у них что-то не в порядке с этой библиотекой.
Здравствуйте, diatlov, Вы писали:
D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.
Почитайте кижку по регекспам.
Вложенные символьные классы(а особенно "широкие", типа точки) с модифкаторами * и + без явных якорей(или с расплывчатыми/часто совпадающими якорями) есть то, что следует избегать. На вскидку не вспомню, но выражение всего из 10 символов при поиске на строке из 20 может дать "подвисание"(а строго говоря, время выполнения несколько часов).
Вобщем, это лучше правда почитать.
А на данный случай — не проще ли разбить поиск на несколько частей? Выражение уж сильно монструозное, несколько более простых облегчили бы задацу, ИМХО.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, diatlov, Вы писали:
D>Если я ставлю .* в нескольких местах то начинаются такие же глюки как и раньше.. глухой вис.
Да, еще. Старайтесь не использовать запоминающие скобки там, где они не нужны. Это тоже сильно на скорость влияет.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, diatlov, Вы писали:
. D>Но все таки программа именно висла. Как можно искать в тексте на 60 Кб подстроку больше 3хминут?
Выражение "(.*?)*" надолго оставит в задумчивости движок регекспа даже на 20 символах во входящей строке
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.