Dva stejné regulární výrazy

tomík

Dva stejné regulární výrazy
« kdy: 28. 05. 2018, 19:01:24 »
Dobrý den.
Mám regulární výraz
^PACKAGE NAME:[ ]{1,}(.*{1,})\\-(.*[\\-].*[\\-].*)(\\.[ti]+[gblzkx]+)[ ]{0,}$   /*linux*/
a                                     ^ změna
^PACKAGE NAME:[ ]{1,}(.{1,})\\-(.*[\\-].*[\\-].*)(\\.[ti]+[gblzkx]+)[ ]{0,}$   /*cygwin*/
a ještě jeden
([a-zA-Z0-9]{1,})[ ]{1,}([a-zA-Z0-9\\/._+\\-]{1,})\\/(.*{1,})\\-(.*[\\-].*[\\-].*)\\.[ti]+[gblzkx]+$ /*linux*/
a                                                    ^ změna       ^ změna
([a-zA-Z0-9]{1,})[ ]{1,}([a-zA-Z0-9\\\/._+\\-]{1,})\\\/(.{1,})\\-(.*[\\-].*[\\-].*)\\.[ti]+[gblzkx]+$  /*cygwin*/

Kde je označeno linux tak funguje jenom v linuxu a v cygwinu ne a kde je označeno cygwin tak funguje v cygwinu v linuxu nevím (nezajímá mně).

Rád bych věděl jestli oba výrazy fungují úplně stejně, i když jsou trochu jiné.
Výraz označený jako linux v cygwinu  vyhodí u funkce regcomp chybu repetition-operator operand invalid a návratový kód 13 tedy REG_BADRPT '?', '*', or '+' not preceded by valid regular expression. V linuxu je to OK.
Po drobné úpravě to chodí i v cygwinu, ale nevím jestli to dělá přesně to stejné. Může mi to prosím někdo potvrdit nebo vyvrátit?


uuuuuuuu

Re:Dva stejné regulární výrazy
« Odpověď #1 kdy: 28. 05. 2018, 19:09:44 »
Tecka a hvezdicka se lisi, takze to muze mit vliv i na regex

Re:Dva stejné regulární výrazy
« Odpověď #2 kdy: 28. 05. 2018, 21:19:33 »
Nenapsal jste, o jaký program nebo knihovnu se jedná. Oba výrazy v žádném případě nefungují stejně, .  zastupuje právě jeden znak, .* zastupuje libovolný počet znaků (včetně žádného znaku). U té druhé dvojice máte navíc dvě zpětná lomítka.

#

Re:Dva stejné regulární výrazy
« Odpověď #3 kdy: 28. 05. 2018, 21:50:46 »
Vseobecne kemo, at v tom mas jasno

.* = greedy, tedy vse az do posledniho vyskytu

.*? = non-greedy, tedy do prvniho vyskytu

!!! alert !!! napr sed .*? neumi, konec alertu ...

tomík

Re:Dva stejné regulární výrazy
« Odpověď #4 kdy: 28. 05. 2018, 22:22:22 »
Jedná se tento soft: https://github.com/jaos/slapt-get . Výrazy jsou v souboru package.h . Pokouším se to zprovoznit na windows.
Ono to .* funguje ale jenom tato kombinace .*{1,} háže chybu při kompilaci (regcomp). Když to upravím na .{1,}, tak je to OK. Ta lomítka mi jsou jasná. Chci li jedno \ tak píšu \\ a chci li / tak píšu \/.


Re:Dva stejné regulární výrazy
« Odpověď #5 kdy: 28. 05. 2018, 22:39:05 »
Jedná se tento soft: https://github.com/jaos/slapt-get . Výrazy jsou v souboru package.h . Pokouším se to zprovoznit na windows.
Ono to .* funguje ale jenom tato kombinace .*{1,} háže chybu při kompilaci (regcomp). Když to upravím na .{1,}, tak je to OK. Ta lomítka mi jsou jasná. Chci li jedno \ tak píšu \\ a chci li / tak píšu \/.

Kombinace .*{1,} je nesmyslná, protože hvězdička i složené závorky určují počet opakovaní. * je to samé, jako {0,}, naopak {1,} je zase to samé, jako + (nevím, zda plus daná knihovna umí). Před výrazem pro počet opakování vždy musí být výraz, který se má opakovat, a před těmi složenými závorkami nic není.

tomík

Re:Dva stejné regulární výrazy
« Odpověď #6 kdy: 28. 05. 2018, 23:48:33 »
Když jsem zjistil co to přesně dělá .*{1,} tak mi to taky přišlo divný proč to tak je, ale divnější mi přijde, proč to tak autor udělal a jaktože to v lin. funguje. Navíc po přepsání na .{1,} to zatím vše funguje normálně a nic nefungujícího zatím nepozoruju. Proto jsem chtěl vědět jestli je mezi těma výrazama (celýma) nějakej rozdíl ve funkci. Ještě bych mohl vyzkoušet tuto úpravu i na linuxu a uvidím (pro porovnání).

Re:Dva stejné regulární výrazy
« Odpověď #7 kdy: 29. 05. 2018, 10:09:51 »
Pro regulární výrazy neexistuje žádný standard, každá knihovna je má trochu jinak. Platí to i pro ty speciální znaky – hvězdička obvykle znamená žádný výskyt až libovolná počet výskytů, ale některé knihovny pro tento případ vyžadují escapovanou hvězdičku \*, a někde hvězdička tenhle význam nemá a bere se jako normální znak. Což je jediné vysvětlení, které bych měl pro tu konstrukci .*{1,} – že to znamená „libovolný znak následovaný jednou nebo více hvězdičkami“. Ale určitě to nezáleží na Linux vs Cygwin, ale konkrétní knihovny, které se v daném případě používají (a může záležet i na konfiguraci té knihovny).

Re:Dva stejné regulární výrazy
« Odpověď #8 kdy: 29. 05. 2018, 13:41:34 »
Pro regulární výrazy neexistuje žádný standard, každá knihovna je má trochu jinak.

Každá knihovna to má sice jinak, nicméně náznak standardizace tu existuje Regular_expression#Standards

Jinak existuje mnoho debuggerů pro regexp, některé jsou on-line a někdy umožňují i porovnat i různé implementace (často php/pcre, javascript, perl, ruby). Některé umožňují i krokovat a sledovat postupné vyhodnocování. Osobně žádný nepoužívám, takže nedoporučím, ale Google poradí.

Že bude cygwin fungovat jinak než linux bych nečekal, je potřeba se podívat, jaká knihovna ty regexpy v daném nástroji/jazyku implementuje a porovnat verze v cygwin a linuxu.

tomík

Re:Dva stejné regulární výrazy
« Odpověď #9 kdy: 29. 05. 2018, 15:08:50 »
Ono právě kombinace .*{1,} svítila červeně když jsem ji hodil do online debugeru. Po odmazaní * pak OK.
Je možné, že v cygwinu chybí funkce strverscmp?  S tou byl taky problém, musel jsem použít strcmp.
Kód co jsem upravil pro cygwin jsem zkompiloval na linuxu a tam je taky funkční i se změnama.

Kit

Re:Dva stejné regulární výrazy
« Odpověď #10 kdy: 29. 05. 2018, 15:46:10 »
Je nutné si uvědomit, že Linux a Cygwin nejsou srovnatelné pojmy. Je zřejmé, že se ten regulární výraz pokoušíš zpracovat různými knihovnami a proto ti dávají různé výsledky.

Re:Dva stejné regulární výrazy
« Odpověď #11 kdy: 29. 05. 2018, 19:33:48 »
Cygwin = GNU OSS + cygwin dll implementující POSIX API pro windows. Jaký dopad to bude mít na regexp knihovny nedokážu odhadnout, ale není vyloučeno ani to, že tam ta knihovna funguje trošku jinak (byť má stejné API).

tomík

Re:Dva stejné regulární výrazy
« Odpověď #12 kdy: 29. 05. 2018, 20:23:32 »
Z mého krátkého pozorování programu vyplývá, že funkce regcomp v cygwinu je trocho jiná než v linuxu a změna části výrazu na .{1,} funguje stejně jako .*{1,} . Ruzné výsledky to nedává, páč by program ten textový soubor asi špatně zpracoval. Takže pro mně asi vyřešeno. ✅ ❇ :)