Ugye, megengedett ez a jelölés?
Ami persze ez szeretne lenni:
(foo|)bar
(foo)?bar
Vagy akár ez:
(foo){,1}bar
Az a kérdésem, az első formula legális-e. A koncepció ugye az, hogy vagy foo, vagy semmi.
- 956 megtekintés
Hozzászólások
Tippre nem fog menni, mert nincs jobb oldalon semmi. De ha mégis, akkor is ellenjavalnám, ha már van neki explicit operátora. Senki nem használja így, és regexet elég nehéz olvasni direkt bonyolítás nélkül is. Én tuti azon kezdenék el gondolkodni (fél perc után, mikor leesett, hogy mi ez), hogy milyen furi side eset van, ami miatt erre szükség volt. Ráadásul guglizni is nehéz rá :-)
- A hozzászóláshoz be kell jelentkezni
Őszinte leszek, nem volt ennek speciális oka, így jutott eszembe, amikor írtam egy shell scriptet. Valahogy az járt a fejemben, hogy nekem vagy az egyik, vagy a másik alternatíva kell, de egyik a másik részhalmaza. Elsőre ez lett volna:
(foobar|bar)
Na jó, de akkor egyszerűsítsünk:
(foob|b)ar
Tételezzük fel, hogy a null string is megengedett:
(foo|)bar
Odáig már valahogy nem jutottam el, hogy ezt írjam le:
(foo)?bar
Most egészen más miatt néztem bele a scriptembe, s magam is csodálkoztam, hogyan oldottam ezt meg korábban. De úgy tűnik, megengedett, az awk, a bash, de a webes ellenőrző eszköz is megbírkózik vele.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Itt tudod tesztelni, tanulni:
https://regex101.com
- A hozzászóláshoz be kell jelentkezni
+1
Ezzel az eszközzel szoktak csekkolni, hogy mennyire gyors a regex. Néha felugrig 8ms-ról 4500ms-ra (például), ilyenkor érdemes elgondolkozni, hogy mi lehet a baj, mert ha most nem is bajos, később az lesz. Sima programozók csak azt nézik, hogy működik-e...
- A hozzászóláshoz be kell jelentkezni
Úgy látom, még a magyarázat szerint is jó groupon belül a nullstring alternatíva. Szóval működik. Amúgy awk-ban és bashben - ez utóbbiban a [[ "$string" =~ regexp ]]
módon vizsgálva - is kipróbáltam, működik.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Az első legális, viszont nem azonos a másik kettővel, azoknál ugyanis a group nem fog létezni, ha nem illeszkedik a "foo".
Azok helyesen:
((?:foo)?)bar
(én ezt szoktam használni, a pipe-os megoldásra soha nem gondoltam :)
((?:foo){,1})bar
- A hozzászóláshoz be kell jelentkezni
A későbbiekben nem hivatkozom a groupra - mint sed-ben például a \1-gyel -, csak az illeszkedés volt a szempont, s azt nézve szerintem kompatibilis a két megoldás.
Amúgy ez a ?: mit jelent? Mindegyik regexben van ideértve az awk-t, grep-et, bash-t is?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A ?: azt jelenti, hogy ugyanugy osszezarojelezed a kifejezest, de group-ba mar ne mentse, mint ha sima () kozt lenne. Gyakorlatilag a matcheles miatt bezarojelezed ?:-al, es utana a kulso zarojel mar csak arra van, hogy fix mennyisegu szamozott group-od legyen attol fuggetlenul, hogy ez matchelt-e vagy sem.
A masik lehetoseg (nemtom mikben van, PCRE tudja) a (?P<izebigyo>foo), ahol nem sorszammal, hanem az izebigyo nevvel tudsz ra hivatkozni a kesobbiekben. Ha mindenre nevvel hivatkozol, olvashatobb, es teljesen mindegy, hogy mi milyen szamot kap.
Egyebkent a (foo|) bar igy fura, de olvashatobb akkor, ha tobb dolog lehetne a foo helyett. Pl.:
(alma|korte|barack|)palinka
--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames
- A hozzászóláshoz be kell jelentkezni
A ?: először a PCRE-ben jelent meg, awk-ban biztosan van, grep-nél ott a -P.
Egyszer-egyszer használt kifejezéseknél nem sokat számít, de ha pármilliós iteráció közepén nem kell az engine-nek feleslegesen pozíciókat eltárolni, az nem egy hátrány.
- A hozzászóláshoz be kell jelentkezni