πŸš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #39787

Re: regex w wielu liniach, mam problem

#39787
From: Grzegorz Szyszlo
Date: Tue, 19 Oct 2004 08:33
80 lines
4986 bytes
Maciej Misiak wrote:
>>Grzegorz Szyszlo wrote:
>>
>>   $line=~/      ^Job \s                              ([^\n]+) $ \n
>>         .*?     ^\s\s Job\ Type \s+             : \s ([^\n]+) $ \n
>>         .*?     ^\s\s Backup\ mode \s+          : \s ([^\n]+) $ \n
>>         .*?     ^\s\s Job\ Start\ Time \s+      : \s ([^\n]+) $ \n
>>         .*?     ^\s+ : \s+ Media \s+            : \s ([^\n]+) $ \n
>>         .*?     ^\s+ Backup\ Last\ Objects? \s+ : \s+ End \s+ ([^\n]+) $ \n
>>         .*?     ^\s+ Job\ End\ Time \s+         : \s ([^\n]+) $ \n
>>         .*?     ^\s\s Completed\ Size \s+       : \s ([\d]+) [^\n]* $ \n
>>         .*?     ^\s\s Failed\ Objects \s+       : \s ([^\n]+) $ \n
>>         .*?     ^\s\s (Job\ Completed\ Succ?essfully) [^\n]* $ \n
>>         /xsm;
> 
> 
> Nie jestem pewien czy w ogole '$ \n' na koncu kazdej linii jest potrzebne. Na 
> poczatku kolejnej linii jest .*? ktore z koncem linii sobie bezproblemowo 
> poradzi. Natomiast dana do pobrania do zmiennych $1-$10 i tak jest czytana az 
> do napotkania konca linii. Wiec proponuje tak:
> 
> $line=~/      ^Job \s                              ([^\n]+)
>         .*?     ^\s\s Job\ Type \s+             : \s ([^\n]+)
>         .*?     ^\s\s Backup\ mode \s+          : \s ([^\n]+)
>         .*?     ^\s\s Job\ Start\ Time \s+      : \s ([^\n]+)
>         .*?     ^\s+ : \s+ Media \s+            : \s ([^\n]+)
>         .*?     ^\s+ Backup\ Last\ Objects? \s+ : \s+ End \s+ ([^\n]+)
>         .*?     ^\s+ Job\ End\ Time \s+         : \s ([^\n]+)
>         .*?     ^\s\s Completed\ Size \s+       : \s ([\d]+) [^\n]*
>         .*?     ^\s\s Failed\ Objects \s+       : \s ([^\n]+)
>         .*?     ^\s\s (Job\ Completed\ Succ?essfully) [^\n]*
>         /xsm;

dobre podejscie, dziala tak jak trzeba. $ \n na koncu stosowalem w celu zachaczenia,
bo na poczatku wyluskiwalem przez (.*?) i wtedy $ \n wymuszal mi dopasowanie
tego wczesniejszego do konca linii. tutaj faktycznie jest to zbedne.

> Poza tym ja bym przemyslal czy na poczatku kazdej linii oraz miedzy dwukropkiem 
> a innymi napisami nie wstawic \s* Zaoszczedzi to bolu glowy, bo trzeba bedzie 
> sie zastanawiac czy np. po Media sa trzy spacje a przed Backup mode dwie czy na 
> odwrot.

to jest akurat charakterystyka logu, i tam sa stosowanie "wciecia", gdzie przed
wcieciem jest roznie, albo tabulator, albo kilka spacji. loteria.
ale zawsze jest jakis "biaΕ‚as" :)

>>Btw. niech nikogo nie dziwia konstrukcje typu:  "Job\ Type" .
>>Chodzi o to, ze przy opcji /x , spacja jest traktowana jakby w zasadzie
>>jej nie bylo, slashowanie pozwala przywrocic jej pierwotne znaczenie.
>>nie wyczytalem tego w zadnym docu, posluzylem sie ta konstrukcja
>>"na czuja" i poszlo. czyzby cos nieudokumentowanego? :)))
> 
> Jesli chodzi o dziwny sposob lapania spacji z backslashem '\ ' to to jest 
> identyczna technika jak w przypadku lapania jakiegokolwiek innego specjalnego 
> znaku, np. \$ albo \. Z powodu przelacznika /x nie mozna normalnie dopasowac 
> spacji, wiec '\ ' jest smiesznie wygladajacym, ale konsekwentnym sposobem 
> zapisu.

szkoda ze przy opisie /x nie jest to szczegolowo omowione. ale dobrze
ze dziala jak powinno.


>>aha. konstrukcja typu .*? z opcja /s  na kolana co prawda
>>nie powala, ale w moim przypadku jest to wystarczajaco wydajne,
>>i osiagam zamierzony rezultat, czyli pominiecie dowolnej partii
>>logu, bez ogladania sie na konce linii. w razie czego
>>zawsze mozna zastosowac [^\n]* jesli konce linii jednak musza
>>miec znaczenie :)
> 
> Wiec wlasnie, wywal znaki konca linii z konca linii :)

i pewnie tak zrobie :)

dzieki za uwagi. chociaz w innym poscie sygnalizuje inny, gorszy problem,
ktorego samym regexpem pokonac nie potrafie, chodzi o to ze w logu niektore
z fraz regexa moga nie wystepowac. chcialbym by odpowiedni $1 - $10 byl
raportowany jako pusty lub undef, ale zeby cale wyrazenie zawsze znalazlo mi
wszystko to, co da sie odnalezc. nie wiem jak to zrobic, byc moze nikt nie wie.

znik.
Technical Details
Message-ID: <cl2jhu$39i$1@news.lublin.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mail
References: <cl056v$uj6$1@news.lublin.pl> <1d72.00000a9b.4173d684@newsgate.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mail
From: Grzegorz Szyszlo <znik@wbc.lublin.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: regex w wielu liniach, mam problem
Date: Tue, 19 Oct 2004 10:33:19 +0200
Organization: lubman
Lines: 81
Message-ID: <cl2jhu$39i$1@news.lublin.pl>
References: <cl056v$uj6$1@news.lublin.pl> <1d72.00000a9b.4173d684@newsgate.onet.pl>
NNTP-Posting-Host: user.wbc.lublin.pl
Mime-Version: 1.0
X-Trace: news.lublin.pl 1098174846 3378 212.182.104.10 (19 Oct 2004 08:34:06 GMT)
X-Complaints-To: abuse@news.lublin.pl
NNTP-Posting-Date: Tue, 19 Oct 2004 08:34:06 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030721 Debian/1.4-1.nobse.2
X-Accept-Language: pl, en-us
In-Reply-To: <1d72.00000a9b.4173d684@newsgate.onet.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit