Pěkný prográmek na experimentování s perlovými regulárními výrazy (a na zjišťování, co si o sobě ten zatracený regulární výraz myslí, že nematchuje ;-) udělal Jura Polcar: http://www.physics.muni.cz/~polcar/tore/
Je to zatím verze 0.1, ale na blbnutí je to dobrý. Použití:
./tore.pl <nějaký_text
(místo přesměrování taky můžete text napsat a ukončit Ctrl-D). Pak píšete regulární výrazy a on vypisuje co se matchlo, do který skupiny, etc.
Názory k článku
Regulární výrazy v příkladech
tore
celé vláknoRe: tore
celé vláknoNie je nad testovanie malych utilitiek o 5am rano. :-) Zial potrebuje to Term/ReadLine/Gnu.pm a nie je mi celkom jasne, ze naco... Citat zo STDIN sa da v Perle aj bez ReadLine.
Re: tore
celé vláknoNa editaci promptu s regulárnímy výrazy, historii, ... etc., prostě přesně na to, co readline normálně dělá. Term::ReadLine::Gnu je celkem standardní modul, ne?
Re: tore
celé vláknos/regulárnímy/regulárními/g
já vím, mám si to po sobě číst, obzvlášť takhle ráno ;-)
Re: tore
celé vláknoTak potom nestandardna je moja instalacia. :-P
Jen drobnost
I kdyz regularni vyrazy pouzivam vcelku bezne, diky za pekny clanek.
Jedina drobnost, v tabulce by, myslim, mela byt uvedena i ta tecka. Marne jsem ji tam hledal uz behem cteni a vzapeti je pouzivana v prikladech. :-)
Poradil by mi nekdo?
celé vláknoPotreboval jsem zformatovat vystup z prikazu mpls na ftp klientovi (stahne mi to strukturu ftp do textoveho souboru). Pomoci regularnich vyrazu jsem si s tim pekne pohral, ale problem je ten ze zformatovani 50MB (cele to funguje jako prohledavac ftp serveru na koleji) textovych informaci trva hrozne dlouho. Na mem Duronu 1.1 GHz neco pres hodinu. zkousel jsem spoustet vice procesu najednou,ale pak se na pocitaci nedalo pracovat. Zajimalo by me tedy, zda je nejaka moznost jak to urychlit,bylo by to rychlejsi mit to napsane v C?
Jinak mi moc pomohl serial regularni vyrazy v minulosti uverejneny na rootovi.
Re: Poradil by mi nekdo?
celé vláknosice nevim, co to to mpls je, ale to asi neni dulezite. kdyz je neco pomale, tak urcite pomuze napsat tomu program "na miru"... Regularni vyrazy jsou dost obecne reseni a proto se za ne plati pomalosti (i kdyz to je kdovijak optimalizovane)...
Taky je dobre v reg. vyrazech pocitaci nejak ulehcit Hned na zacatku promaznout vsechno, co neni treba, aby se tim nemusel zbytecne zabyvat a zmensil se objem dat, lepe formulovat vyrazy a podobne.
Pokud to je vazne dulezite, rozhodne by stalo za to to v nejakem jazyku prepsat bez (nebo jen s minimalnim) pouzitim regularnich vyrazu. (Kdyz uz ne v C, tak alespon v Perlu, PHP...)
Re: Poradil by mi nekdo?
celé vláknoprimo v libc jsou utility na praci s regexp: regexec a regcomp (hlavickovy soubor regex.h). Vzhladem k danemu pripadu bude asi nejjednoduzsi pouzit je. No a casto pomaha zmena algoritmu...
Re: Poradil by mi nekdo?
celé vláknoJednak bych zkusil použít sed, a jednak to dost závisí na tom, co s tím textem potřebujete dělat, a jak ty výrazy uspořádáte -- rozdíl v rychlosti může být taky typu exponenciální/lineární (u PCRE).
pouzivam sed v bashi
celé vláknovsechny prikazy delam v bashi:
zkusim tady vlozit zdrojak ale nekamenujte mne za moje programatorske schopnosti,nejsem programator :)
takto vypada nenaformatovany text:
/d:/My Music/Alba/Clawfinger:
total 397792
-rw-rw-rw- 1 user group 1622 May 27 2002 !Clawfinger.m3u
---------- 1 user group 4696317 Jun 27 2000 Back To The Basics.mp3
a takto naformatovany:
HSTNAME/d:/My Music/Alba/Clawfinger/!Clawfinger.m3u 1622 27 01 2003 09:47:54
HOSTNAME/d:/My Music/Alba/Clawfinger/Back To The Basics.mp3 4696317 27 01 2003 09:47:54
a toto je ten skript:
#!/bin/bash
#cesta=/ #promenna cesta #nakonec zbytecne
datum=`date '+%d %m %Y %T'`
sed -e s/:$//g ./ftpseznam/$1 > temp #odstrani : na konci radky
sed -e /^total\ \[0-9]/d temp >temp2 #odstrani zbytecnost o total cislo
sed -e 's/\([^ ]*[ ][ ]*\)\{4\}\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\([^ ]*\)[ ][ ]*\(.*\)/\6 \2/' temp2 >temp
#spocitat pocet radku souboru
pocet=`wc -l temp | cut -c0-7`
#echo $pocet
for i in $(seq 1 $pocet)
do
radek=`sed ''$i'q;d' temp` #2X RYCHLEJSI !!!
#echo "$radek"
if [ -z "$radek" ] #pokud je radek prazdny, vzdy kdyz nasleduje cesta
then
#echo PRAZDNY #zde posun o jedno dolu ++i ;nacteni cesty do promenne; --i;
i=`expr $i + 1`
radek=`sed ''$i'q;d' temp`
cesta=$radek
#echo $radek #je to zbytecne tento radek se opakuje i jako soubor
i=`expr $i + 1`
else
x=$radek # pri primem dosazeni mi to blblo
y=$cesta
if [ "$x" != "$y" ]
then
#echo tento radek NECHAT
echo $1$cesta/$radek $datum>>./ftpformat/$1
#echo $1/$cesta/$radek
fi
fi
done
Re: pouzivam sed v bashi
celé vláknoNo, to jsem si myslel :o)
Zkuste použít mocný find. Následující příkaz sice negeneruje úplně přesně váš formát (nechtělo se mi už hledat v find(1) detaily), ale myslím, že to snadno upravíte
find /cesta/k/souborům/ -type f -printf '%p %s %Td %Tm %TY %TT\n'
Re: pouzivam sed v bashi
celé vláknoNo kolegu froida znam, a to co dela trosku taky. Zapomel zminit, ze vygenerovany list je z FTP, takze find tam pujde pouzit ponekud spatne.
Re: pouzivam sed v bashi
celé vláknoHm. Tak to je samozřejmě kapku problém ;-)
V tom případě navrhuju napsat to celý jako skript v Perlu, protože nejvíc sežerou fork()y, pouští se tam tisíce procesů.
Jinak místo tří sedů po sobě samozřejmě je lepší sed -e ... -e ... -e ..., etc.
Re: pouzivam sed v bashi
celé vláknopro zacatek bych nahradil
sed -e /^total\ \[0-9]/d temp >temp2 #odstrani zbytecnost o total
prikazem grep -v "^total [0-9]"
jam
Re: pouzivam sed v bashi
celé vláknoJa bych si ten for napsal asi radsi, jako ceckovej program, protoze pro 55MiB tam bude neurekom execu a podobnych svinstev. Zas tak slozite veci vevnitr nejsou.
Re: perl
celé vláknodoporucuju to napsat v perlu a ty regulary nechat na zacatku programu zkompilovat, dela se to pomoci qr|<reg>|
Re: perl
celé vláknoqr// ma smysl jedine v pripade, ze v regularnim vyrazu pouzivate promenne.
To jest
$re = qr/$ARGV[0]/;
while (my $line = <FILE>) {
if ($line =~ $re) { ...
}
Pokud je regexp staticky tak se zkompiluje se zbytkem skriptu.
Jenda
mimo jine
celé vláknozkuste regexplorer
jinak, i presto, ze regularni vyrazy skoro denne pouzivam, neco jsem pomoci nich napsal a sleduju mimo jine clanky na rootu, presto se me znich dela porad spatne a desi me predstava delat s nimi cokoli slozitejsiho, je to skutecne prave peklo co kdo vymyslel, pripodobnil bych to snad jedine ke asembleru, des a hruza na nas z regularnich vyrazu cisi...
dekuji za rady
celé vláknodekuji vam za rady a podnty. Algoritmus se 100 procentne vylepsit da, jen si k tomu musim sednout :)
Re: mimo jine
celé vláknoTo me se naopak dela spatne z jazyku ktere je nepodporuji nebo me kvuli jednomu regexpu nuti napsat pet radku kodu.
Ja kdyz potrebuju neco, prakticky cokoli, s retezcem tak se mi rovnou radi v hlavne obskurni znaky a leze ze me regexp :-)
Deterministicky vs. nedeterministicky
celé vláknoJen drobnou pripominku k teto vete vyskytujici se v clanku..."Ze všeho nejdříve si pro něj sestaví konečný (nejlépe deterministický, aby se dobral výsledku) automat."
Tu poznamku v zavorce nechapu. Deterministicke a nedeterministicke konecne automaty jsou ekvivalnentni. Nedeterministicke konecne automaty samozrejme take davaji vysledky (jinak by byly k nicemu), a ke kazdemu nedeterministickemu konecnemu automatu lze sestrojit trivialne deterministicky, ktery je co do prijimanych slov ekvivalentni puvodnimu nedeterministickemu.
Re: Deterministicky vs. nedeterministicky
celé vláknoJojo, to je, ale sestevit nedeterm. automat pro regex je trivialni, kdezto determ. uz tak trivialni neni - teda, neni jednoducha implementace, teorie jednoducha je. Taky ma tato transformace jeden docela neprijemny hacek, prevodem z nedet. na det. roste exponencialne pocet stavu. Zkuste si treba vyraz (a|b)*a(a|b)^n, teda posloupnost acek a becek, kde n-ty znak pred koncem je acko. Zjistite, ze pocet stavu determ. automatu je neco kolem 2^n. V praxi se to dela tak, ze se automat ponecha nedeterministicky a hledani vzorku dat se provadi na nem, pricemz jeden stav je n-bitove cislo, kde n je pocet stavu onoho nedet. automatu. Je pak mozne jakoby byt ve vice stavech najednou - ve kterych to urcuji bity onoho n-bitoveho cisla. Prechodova funkce je snad zrejma ;-))))
regex->automat
Jen pro zajimavost, neni zase az tak uplne jednoduche prevest regex na prislusny automat, tedy na determ. automat. Dlouho jsem hledal vhodnou knihovnu (v cecku) a nenasel. Teda, nasel :-), ale uplne nahodou a v uplne jinem kontextu. Stahnete-li si squirm, je ve zdrojacich adresar regex-xx.xx a v nem velmi pekna knihovnicka (regex.c) asi 5000 radku a k tomu moc pekna dokumentace. Nemate-li co delat, prohlidku tohoto zdrojaku (minimalne dokumentace) muzu vrele doporucit, muze se to hodit ;-)
mastering regular expressions (pdf)
celé vláknobola tu spomenuta, pre zaujemcov ju mam aj ako pdf:
http://www.pobox.sk/~mico/mastering.regular.expressions.pdf
Re: mastering regular expressions (pdf)
celé vláknoBilý znak
celé vláknoČlánek je vcelku dobrý, akorát jsem ještě neviděl výraz "white space" překládat jako "bílý znak". Je to dost otřes.
Re: Bilý znak
celé vláknoNo a jak byste to teda prelozil? lzap
OpenOffice
.. skoda jen ze momentalne regularni vyrazy nefunguji v OpenOfficech (1.0.2) :(, ale jejich podpora by uz mohla byt ve verzi 1.1beta.
Viz : http://www.openoffice.org/issues/show_bug.cgi?id=3393
Preklad regularek do C
celé vláknoRad bych pouzival regularky i mimo skriptovaci jazyky, vim ze jsou ruzne knihovny pro pouziti v C++, Pascalu atd... Ale ty napred musi regularku naparsovat a pak teprve spusti hledani, takze pro velka data jsou pomalejsi
Jedna se mi o generator, do ktereho bych zadal regularni vyraz a on vyplivl kratky kod v C++ , ktery pouziva standartni retezcove funkce. O necem takovem jsem slysel, ale za boha to nemuzu najit.
Priklad regularka 'aa' ->
if (strpos('aa',nejakystring)<>-1)
return true;
else
return false;
Re: Preklad regularek do C
celé vláknoRe: Preklad regularek do C
celé vláknoNo, mne by to taky zajimalo.. ;)
Vynikajuci clanok
Uz dlho hladam prilezitost naucit sa a pochopit rexexp. Z celeho srdca dakujem autorovi za tento clanok. JE VYMAKANY.
bloody
aby nebylo "asp" na konci?
V článku mě dostal jeden z uvedených příkladů.
> Příklad: http://[a-zA-Z_.]+
> Tímto výrazem můžeme snadno nalézt webové
> odkazy. Jistě byste už dovedli zkonstruovat
> odkaz, který by například našel jen ty odkazy,
> které by nekončily řetězcem "asp".
Jako jeden regulární výraz? V článku jsem nenašel nic, co by mi to umožnilo.
"...(?!asp)$" by asi šlo v sedu, ale o tom v článku nic nebylo. Mohl bych taky vyjmenovat všechny tříznakové varianty (kromě asp) :-O
Nejde to nějak snadno? Autor článku se tváří, jako by to bylo to nejjednodušší na světě.
(Ještě to jde vícero výběrama...
egrep -v "asp$" | egrep "...")
Absence znaku &
celé vláknoPřekvapuje mě to hlavně proto, že existuje | pro nebo. A na & zapomněli...? Děkuji za případnou odpověď na dense@email.cz
Re: Absence znaku &
celé vláknoco takhle treba \d\b\d? neni to nahodou to, co hledas? cili ce tvem podani (\d)&(\b)&(\d)? :-)
oznaceni skupiny
Dobry den,
prosim mohli byste mi nekdo vysvetlit, co znamena (()|a|b|c|d)*?
hledal jsem to v tech vysvetlivkach, ale nedava mi to smysl. Je to libovolna permutace ze znaku a,b,c,d a ()?
Vyhledání hexdecimálu na začátku řetězce
Potřeboval bych vyhledat pomocí regulárního výrazu na začátku souboru speciální znaky v hexdecimálním formátu, můžete mi prosím poradit jak na to?
Zkoušel jsem níže uvedený výraz, ale bezvýsledně (pravděpodobně budou na vině mezery mezi dvoucifernými hodnotami).
^00 00 01 00

