PDA

Просмотр полной версии : Регулярки


Relli
24.06.2012, 23:02
Уважаемые,у меня есть проблема.
При использовании регулярного выражения,программа просто напросто виснет:
if reg.Exec(Pars.Text) then
Трассировал,когда трассировка доходит до этой строчки - программа виснет...До этого парсило 2-3 страницы и висло тутже...а сейчас сразу же...
Какие есть варианты,что может быть причиной?(даже ошибки не вылазиет)

Mebius
25.06.2012, 00:11
что в дебаггере пишется?

Relli
25.06.2012, 08:14
Mebius, ничего,просто виснет и все.

Relli
26.06.2012, 08:46
Хм,программе теперь не виснет....Просто ничего не делает дальше...после "reg.Exec(s)" трассировка тупо не идет.Останавливается на этой строке без каких либо ошибок.

Mebius
26.06.2012, 10:03
Хм,программе теперь не виснет....Просто ничего не делает дальше...после "reg.Exec(s)" трассировка тупо не идет.Останавливается на этой строке без каких либо ошибок.

скрин сделай и покажи. не может быть что б она без каких либо выводов в дебаге просто висла

Relli
26.06.2012, 13:28
скрин сделай и покажи. не может быть что б она без каких либо выводов в дебаге просто висла
Ну вот,мы доходим до этой строчки:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Вот,мы ее трассируем,и дальше не идет,хотя прога не висит
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Mebius
26.06.2012, 15:07
нафиг мне этот то скрин) ты мне окно дебага сфоткай

ЗЫ само выражение задал?

Relli
26.06.2012, 15:11
Mebius, да

Skrillex3
26.06.2012, 15:25
а ты этот Pars хоть создал?

Relli
26.06.2012, 15:25
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
после брекпоинта,я пытаюсь протрассировать строку,но дальше не идет ни строка,ни логи

Добавлено через 2 минуты
Skrillex3, еслибы я не создал,то он мне бы выдал ошибку,как минимум на том месте,где я загружаю страницу в эту переменную.

VeTaL_UA
26.06.2012, 15:43
Выброси регулярки /dgs

Добавлено через 25 минут
Выброси регулярки /dgs

Mebius
26.06.2012, 16:32
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
после брекпоинта,я пытаюсь протрассировать строку,но дальше не идет ни строка,ни логи

Добавлено через 2 минуты
Skrillex3, еслибы я не создал,то он мне бы выдал ошибку,как минимум на том месте,где я загружаю страницу в эту переменную.

/facepalm убери закраски эти, убери брейкпоинт, я вот щас напишу в делфе на пустом текстовом документе if (Reg.Exec(Rus)) then и буду спрашивать тут почему она не работает

Relli
26.06.2012, 23:03
Mebius, я закрасил имя проекта и путь по которому лежит,тебе это ничто не даст.
VeTaL_UA, построчно копи-поз уж слишком долго)

Mebius
26.06.2012, 23:11
Mebius, я закрасил имя проекта и путь по которому лежит,тебе это ничто не даст.
VeTaL_UA, построчно копи-поз уж слишком долго)

закрасил стандартное название Project1? O_o

а если закоментить условие то дальше пойдет? попробуй в трай эксепт засунуть и посмотреть

Relli
27.06.2012, 08:15
Mebius, нет)Название не стандартное)
исключения не катят(тру экспет)....если убрать парс,то все ок,страницы получает как надо,виснет именно на Reg.Exec(я пробовал отдельно вставить,без условия)

Mebius
27.06.2012, 09:34
в модуль регулярок лазал руками?

VeTaL_UA
27.06.2012, 10:08
Ramsteins, давай перепишу тебе твои регулярки на Copy Pos Delete?

Relli
27.06.2012, 13:26
Mebius, нет.
VeTaL_UA, если сможешь,то ок)

VeTaL_UA
27.06.2012, 17:50
VeTaL_UA, если сможешь
Чё ж не смогу :) В аське тебя нету, так что лови здесь.

Функция, что определяет количество повторов строки в строке (самописная, используется для следующей функции):


function PosX(s2,x:string):integer;
var
k,p,l:integer;
s3:string;
begin
l:=Length(x);
p:=Trunc(Length(s2)/l);
result:=0;
for k:=0 to p-1 do
begin
s3:=Copy(s2,k*l,l+l-1);
if Pos(x,s3)<>0 then
begin
inc(result);
end;
end;
end;

function PosY(s4,y:string):integer;
var
k,l:integer;
begin
result:=0;
l:=Length(y);
while k<>0 do
begin
k:=Pos(y,s4);
if k<>0 then
begin
inc(result);
Delete(s4,1,k+l);
end;
end;
end;

Сама функция парса:

function Pars(s:string):string;
var
s1,s2:string;
i,j,n,m,o:integer;
begin
i:=5;
j:=5;
n:=0;
o:=Pos('u0040',s);
result:='';
if o<>0 then
begin
repeat
s1:=Copy(s,Pos('u0040',s)-i,j);
m:=PosX(s1,'","'); //PosY(s1,'","');
if m=0 then
begin
inc(n);
end;
if odd(n) then
begin
if m=1 then
begin
j:=j+10;
end
else
begin
i:=i+5;
end;
end
else
begin
if m=1 then
begin
i:=i+5;
end
else
begin
j:=j+10;
end;
end;
until m=2;
s2:=Copy(s1,0,10);
s1:=Copy(s1,Pos('","',s1)+3,Length(s1)-Pos('","',s1)+3);
s1:=Copy(s1,0,Pos('","',s1)-1);
result:=s1;
end;
end;

Пример использования:

Edit1.Text:=Pars(Memo1.Lines.Text);

P.S. Да, это было сложно написать :)