regex.h

 ( kelemzol | 2009. december 31., csütörtök - 18:08 )

Üdv!
Minta illesztéssel kapcsolatban szeretnék segítséget kérni:

regex.h-val megoldható, hogy tetszőleges számú darabba vágja szét a regexec() a bemeneti sztringet?
pl:
regcomp(&comp,[??],REG_EXTENDED);
regexec(&comp,"/usr/share/amsn/lang[..stb]",32,regex_tomb,0);
[??] helyére, milyen kifejezést kell írnom, hogy a regexec paramétereitől függetlenül, minden mappanevet külön kigyűjtsön?

A válaszokat előre is köszönöm!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ehhez minek regex? strtok(3).
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Elméleti szinten érdekel a dolog:P

man 3 strok:

...

BUGS
Avoid using these functions.

SPAMtelenül - MX spamszűrő szolgáltatás, ahogyan még sosem próbálta

Nem tudom, nekem mukodott mindig. Egyszerubb, mint kezzel megirni ugyanezt, vagy regex-szel kinlodni.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Az strtok()-al az a probléma, hogy nem lehet csak egy karakteres elválasztókat megadni.
De mint mondtam, csak elméleti szinten érdekel. Azért köszönöm a választ!

Ja, azt hittem, hogy egy path-et akarsz alkotoelemeire bontani.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Csak egy példa volt.

Nem értem igazán a kérdést. Ott van a tömböd, amibe max. annyi eredményt kapsz, amennyit megadsz előtt (jelen esetben 32). Ha nincs elméleti felső korlát az egyezésekre, vagy nem tudod mekkora, akkor pedig ciklusban mindig egy találatra hívod és utána a következő iterációban csak a találat végétől az eredeti sztring végéig nézed. A BSD-s grep is így működik:
http://p4db.freebsd.org/depotTreeBrowser.cgi?FSPC=//depot/projects/soc2008/gabor_textproc/grep&HIDEDEL=NO

(util.c -ben van ez a konkrét rész)

Válaszoltam a kérdésedre? Vagy mást szerettél volna megtudni?

Igen ez jó ötlet...
Eredetileg, a regex() a kivágásoknál a '(' ')' -k közé foglalt egységeket vagdalja külön. Ezzel az a baj, hogy ilyenkor a programozónak mindig tudnia kell, hogy hány részre tördelendő bemenetet kap.
Engem az érdekelt volna, hogy rá lehet-e kényszeríteni a regexec()-t egy megfelelő mintával arra, hogy ezt ő oldja meg. -Tudod a jó programozó lusta :P -

Fontos, hogy a klasszikus regex.h-val tedd? Van egy olyan sejtesem - bar reg hasznaltam mar c-bol, leginkabb scriptnyelvekbol hivom, hogy a PCRE tud ilyet (preg_split).

A PCRE tobbet tud, mint a hagyomanyos, emiatt kenyelmesebb is, es a tapasztalat azt mutatja, hogy meg gyorsabb is az illesztes.

--
"You will have to look a long way before you find a bunch of scum-suckers more greedy, humourless and deserving of death than the suits in the music business." - Terry Pratchett

PCRE nem POSIX regex, hanem Perl szintaxisú. Ez tudtommal kevés esetben jelent eltérést, de van eltérés.

Az, hogy a PCRE gyorsabb-e az attól függ minél. A regex.h az önmagában egy POSIX standard és egyáltalán nem biztos, hogy mindenki glibc-t használ.

Amúgy regex.h nem tud ilyet, de a ciklusos megoldással, amit írtam írsz rá egy wrappert, ami ad egy pointert a találatokkal meg egy int értéket a találatok számával és meg is van.