Hlavní navigace

Názory k článku
Regulární výrazy v příkladech

Yeti
Yeti (neregistrovaný)
28. 1. 2003 1:28 Nový

tore

celé vlákno

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.

Nepto
Nepto (neregistrovaný)
28. 1. 2003 5:17 Nový

Re: tore

celé vlákno

Nie 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.

Yeti
Yeti (neregistrovaný)
28. 1. 2003 6:51 Nový

Re: tore

celé vlákno

Na 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?

Yeti
Yeti (neregistrovaný)
28. 1. 2003 6:53 Nový

Re: tore

celé vlákno

s/regulárnímy/regulárními/g

já vím, mám si to po sobě číst, obzvlášť takhle ráno ;-)

Nepto
Nepto (neregistrovaný)
1. 2. 2003 7:01 Nový

Re: tore

celé vlákno

Tak potom nestandardna je moja instalacia. :-P

Jiri Svoboda
Jiri Svoboda (neregistrovaný)
28. 1. 2003 9:57 Nový

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. :-)

froid
froid (neregistrovaný)
28. 1. 2003 11:02 Nový

Poradil by mi nekdo?

celé vlákno

Potreboval 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.

Michal Burda
Michal Burda (neregistrovaný)
28. 1. 2003 11:38 Nový

Re: Poradil by mi nekdo?

celé vlákno

sice 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...)

kokot
kokot (neregistrovaný)
28. 1. 2003 11:41 Nový

Re: Poradil by mi nekdo?

celé vlákno

primo 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...

Yeti
Yeti (neregistrovaný)
28. 1. 2003 13:10 Nový

Re: Poradil by mi nekdo?

celé vlákno

Jednak 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).

froid
froid (neregistrovaný)
28. 1. 2003 14:33 Nový

pouzivam sed v bashi

celé vlákno

vsechny 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

Yeti
Yeti (neregistrovaný)
28. 1. 2003 15:01 Nový

Re: pouzivam sed v bashi

celé vlákno

No, 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'

moje
moje (neregistrovaný)
28. 1. 2003 17:15 Nový

Re: pouzivam sed v bashi

celé vlákno

No kolegu froida znam, a to co dela trosku taky. Zapomel zminit, ze vygenerovany list je z FTP, takze find tam pujde pouzit ponekud spatne.

Yeti
Yeti (neregistrovaný)
28. 1. 2003 17:48 Nový

Re: pouzivam sed v bashi

celé vlákno

Hm. 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.

jam
jam (neregistrovaný)
28. 1. 2003 16:09 Nový

Re: pouzivam sed v bashi

celé vlákno

pro zacatek bych nahradil
sed -e /^total\ \[0-9]/d temp >temp2 #odstrani zbytecnost o total

prikazem grep -v "^total [0-9]"

jam

moje
moje (neregistrovaný)
28. 1. 2003 17:21 Nový

Re: pouzivam sed v bashi

celé vlákno

Ja 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.

Tomik Janousek
Tomik Janousek (neregistrovaný)
28. 1. 2003 18:49 Nový

Re: perl

celé vlákno

doporucuju to napsat v perlu a ty regulary nechat na zacatku programu zkompilovat, dela se to pomoci qr|<reg>|

Jenda
Jenda (neregistrovaný)
3. 2. 2003 22:38 Nový

Re: perl

celé vlákno

qr// 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

kokot
kokot (neregistrovaný)
28. 1. 2003 11:38 Nový

mimo jine

celé vlákno

zkuste 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...

froid
froid (neregistrovaný)
28. 1. 2003 13:08 Nový

dekuji za rady

celé vlákno

dekuji vam za rady a podnty. Algoritmus se 100 procentne vylepsit da, jen si k tomu musim sednout :)

Jenda
Jenda (neregistrovaný)
3. 2. 2003 22:41 Nový

Re: mimo jine

celé vlákno

To 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 :-)

Jirka Kosina
Jirka Kosina (neregistrovaný)
28. 1. 2003 11:53 Nový

Deterministicky vs. nedeterministicky

celé vlákno

Jen 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.

smrt
smrt (neregistrovaný)
28. 1. 2003 12:30 Nový

Re: Deterministicky vs. nedeterministicky

celé vlákno

Jojo, 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 ;-))))

smrt
smrt (neregistrovaný)
28. 1. 2003 12:14 Nový

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 ;-)

mico
mico (neregistrovaný)
29. 1. 2003 8:12 Nový

mastering regular expressions (pdf)

celé vlákno

bola tu spomenuta, pre zaujemcov ju mam aj ako pdf:

http://www.pobox.sk/~mico/mastering.regular.expressions.pdf

sfsd
sfsd (neregistrovaný)
20. 1. 2006 9:26 Nový

Re: mastering regular expressions (pdf)

celé vlákno
safsdfsdfs
Jarda
Jarda (neregistrovaný)
29. 1. 2003 12:25 Nový

Bilý 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.

lzap
lzap (neregistrovaný)
6. 2. 2003 12:16 Nový

Re: Bilý znak

celé vlákno

No a jak byste to teda prelozil? lzap

Jan Hradek
Jan Hradek (neregistrovaný)
29. 1. 2003 14:00 Nový

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

Jan Kotek
Jan Kotek (neregistrovaný)
29. 1. 2003 14:02 Nový

Preklad regularek do C

celé vlákno

Rad 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;

TheBurn
TheBurn (neregistrovaný)
12. 2. 2005 13:41 Nový

Re: Preklad regularek do C

celé vlákno
Taky by se mi to hodilo... :o]...
Martin
Martin (neregistrovaný) ---.cust.termsnet.cz
21. 2. 2010 9:39 Nový

Re: Preklad regularek do C

celé vlákno

No, mne by to taky zajimalo.. ;)

bloody
bloody (neregistrovaný)
31. 1. 2003 8:42 Nový

Vynikajuci clanok

Uz dlho hladam prilezitost naucit sa a pochopit rexexp. Z celeho srdca dakujem autorovi za tento clanok. JE VYMAKANY.

bloody

uživatel si přál zůstat v anonymitě
7. 2. 2003 12:21 Nový

Bez titulku

Bébul
Bébul (neregistrovaný)
20. 3. 2003 9:56 Nový

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 "...")

koudis
koudis (neregistrovaný)
3. 4. 2004 16:38 Nový

diky

dekuji, konecne sem bliz pochopeni regularnich vyrazu :)

dense
dense (neregistrovaný)
1. 3. 2006 9:35 Nový

Absence znaku &

celé vlákno
Už jsem prošel několik návodů a nikde jsem nenašel jakým způsobem zapsat "výskyt jednoho řetězce a současně! výskyt druhého řetězce". Zkrátka překvapujeme mě, že neexistuje něco jako: (slovo1)&(slovo2).
Překvapuje mě to hlavně proto, že existuje | pro nebo. A na & zapomněli...? Děkuji za případnou odpověď na dense@email.cz
fra.iesus
fra.iesus (neregistrovaný)
6. 5. 2007 14:13 Nový

Re: Absence znaku &

celé vlákno
??? zapomneli?
co takhle treba \d\b\d? neni to nahodou to, co hledas? cili ce tvem podani (\d)&(\b)&(\d)? :-)
padan
padan (neregistrovaný) ---.cust.nbox.cz
20. 3. 2011 12:32 Nový

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 ()?

Georgo
Georgo (neregistrovaný) ---.oltis.cz
31. 5. 2011 13:36 Nový

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

Zasílat nově přidané příspěvky e-mailem