regexp: egyszer vagy egyszer sem

Ugye, megengedett ez a jelölés?

(foo|)bar
Ami persze ez szeretne lenni:

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

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

Ő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

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