Terve,
Mulla on seuraavanlainen merkkijono: 'A/B/C/D/'
Mikä olisi säännöllinen lauseke, joka täsmää tuohon merkkijonoon kun vain jompikumpi B tahi D täsmää lopun lausekkeen kanssa? Siis 'A//C/D/' tai 'A/B/C//'.
No miten olisi lauseke "A//C/D/|A/B/C//"?
Ei mitään muuta keinoa ole kuin tuo? Vaikuttaa hieman vaikealta, jos merkkijono ja ehdot olisi monimutkaisempia. Jos vaikka sanotaan, että jokaista kirjainta vastaisi oikean ohjelman oma pitkä säännöllinen lauseke.
Kuulostaa taas vahvasti siltä, että yritetään tehdä asioita väärin.
Jokaiselle kirjaimelle on oikeassa ohjelmassa oma säännöllinen lauseke, joka poimii kenoviivojen välistä jotain tarpeellista.
Jos säännölliset lausekkeet täsmää B:hen C:hen ja D:hen niin A:n säännöllinen lauseke ei saa täsmätä.
Jos säännölliset lausekkeet täsmää A:han C:hen ja D:hen niin B:n säännöllinen lauseke ei saa täsmätä.
jne...
Tuosta tulee helposti puoli näytöllistä säännöllistä lauseketta kun yhdistän kaiken?
Niin ja todennäköisesti tässä nyt yritetään jotain erittäin väärää :D
No eikö siihen voisi tehdä erilliset lausekkeet A:lle, B:lle, C:lle ja D:lle ja sitten ohjelmassa katsoa mitkä mätsäsi ja oliko tulos hyväksyttävä?
Kyllä voi. Etsin vain sitä "oikeaa" tapaa tehdä tuo.
Pythonissa on mahdollista kirjoittaa myös näin: 'A/(B)?/C/(?(1)|(D))/'. Tässä rakenne (?(1)X|Y) vaatii lausekkeen X, jos sulkulauseke 1 on mukana, ja muuten lausekkeen Y. Ratkaisussa siis sulkulauseke 1 on B, lauseke X on tyhjä ja lauseke Y on (D). Tämän ratkaisun olisit ehkä löytänyt itsekin netistä (sanat: conditional regex).
Kuitenkin pidän yhtä hyvänä myös alkuperäistä ratkaisua, koska se on selvä ja toimii muillakin kielillä. Lausekkeen osat voi pitää muuttujissa, jolloin samaa lausekkeen osaa ei tarvitse koodissa toistaa. Jos pieni lyhennys on vielä välttämätön, sen voi kirjoittaa muotoon 'A/(B/C/|/C/D)/'.
Muista laittaa tarvittaessa lausekkeen alkuun ^ ja loppuun $.
Aihe on jo aika vanha, joten et voi enää vastata siihen.