Eroja regexp-kirjastoissa
Regexp-kirjastot ovat funktionaalisesti kaikki samanlaisia. Vai ovatko?
Eivät sittenkään. Osassa on mietitty vähän hämärämpiä käyttötapauksia, ja mahdollistettu muun muassa osittaisen matchin erottaminen epäonnistuneesta matchista. Kaikkein yleisikäyttöisin rajapinta olisi sellainen, joka mahdollistaisi täyden streamauksen, mutta se on harvinainen.
Otetaan esimerkki käyttötapauksesta: webissä on sivu, ja sivulla lomake, jossa on kenttiä, joilla on jotain muotovaatimuksia. Kehittäjä määrittelee muotovaatimuksen regexpillä. Halutaan dynaamisesti päivittyvä feedback, joka osaa kertoa, ei pelkästään onko kenttään kirjoitettu data kelvollista tai kelvotonta, vaan myös että voisiko se olla kelvollista, jos siihen lisättäisiin vielä jotain. Näin esim. luottokorttinumero olisi kesken kirjoittamisensa tilassa “ei vielä ok, mutta jos kirjoitat lisää, voisi olla ok”.
Tämän toteuttaminen pelkällä regexpin match-metodilla on hieman hankalaa. Aidoille regexpeille voidaan toteuttaa automaattinen transformaatio, joka muuttaa yhden regexpin toiseksi, joka matchaa kaikkiin ensimmäisen valideihin prefikseihin. Jos regexpejä laajennetaan epäaidoiksi sallimalla back referencet, tämä strategia ei enää edes toimi.
PCRE:ssä (C-kirjasto) erottelu saadaan aikaan antamassa pcre_exec:ille flageissa PRCE_PARTIAL_HARD, ja tunnistamalla paluuarvona PCRE_ERROR_PARTIAL (vastakohtana PCRE_ERROR_NOMATCH:ille). (Englanninkielinen termi on partial match.)
Muita tutkiessa vastaan tulleita kirjastoja, joissa tämä onnistuu, on Boost (C++) ja JRegex (Java). Boostia voi pitää jossain määrin standardina C++-ympyröissä. Javassa useimmat ammatinharjoittajat käyttävät standardikirjaston regexpejä, eikä tule mieleenkään, että parempikin ratkaisu (ja kyllä, JRegex on monilla tavoin parempi) on olemassa.
Pythonin standardikirjasto ei tätä tue, eikä laajennustakaan löydetty. Samoin kävi Javascriptin tapauksessa.
Oikeastaan ainoa asia, joka jäi enemmän häiritsemään, oli Javascript. Alkuperäinen käyttötapaushan haluttaisiin tietysti toteuttaa Javascriptillä, koska kyseessä on selaimessa tehtävä tarkistus.
Jos tarinassa on mitään varsinaista opetusta, se on se, että sen jälkeen, kun joku ominaisuus on saavuttanut kielen standardikirjaston, viat, jotka siihen ovat jääneet, ovat ikuisia. Vaikka ne korjattaisiinkin laajennukseen, suurin osa kehittäjistä käyttää standardikirjastoa. Tämä ei tietenkään koske suoranaisia bugeja toteutuksessa, koska ne on helppo korjata, vaan tällaisia korkeamman tason ajatusvirheitä siitä, mikä on mahdollisten käyttötapausten kenttä.
Niin, se täysi streamaus: kuvitellaan tilanne, jossa matchattava sisältö on pitkää, syöte tulee streamista ja tulos menee streamiin. Tällöin olisi hyötyä regexp-matcherista, jolle syöte voidaan antaa mielivaltainen pala kerrallaan, ja joka aina palan jälkeen osaa sanoa, missä tilassa on. Nämä tilat ovat no match, match ja ei voida tietää vielä, eli osittainen match.
Yleiskäyttöisiä palikoita suunnitellessa on aina ristivetoa streamattavien rajapintojen laajemman käytettävyyden ja kerralla asiat tekevien rajapintojen implementoinnin helppouden välillä. Aina oikeaa valintaa ei ole.
Yhteystiedot
Ota yhteys ja kysy Codenton palveluista! Puhelin 040-729 2733, info[at]codento.comTagit
aamiaistilaisuus agile ajankohtaista amazon arkkitehtuuri avoin lähdekoodi aws c CAP cvs ec2 eucalyptus futurologia git google hadoop hajautetut järjestelmät java kirjat konsultointi mapreduce näin meillä ohjelmistotuotanto ohjelmointi ohjelmointikielet pilvi projektit python rekrytointi s3 scala scrum skaalautuvuuden abc skaalautuvuus startup subversion suorituskyky tapahtumat tiedostojen synkronisointi tietokanta vaatimusmäärittely verkkopalvelut versionhallinta virtualisointi välimuistiArkisto
- helmikuu 2012
- tammikuu 2012
- joulukuu 2011
- marraskuu 2011
- lokakuu 2011
- huhtikuu 2011
- maaliskuu 2011
- helmikuu 2011
- tammikuu 2011
- joulukuu 2010
- marraskuu 2010
- lokakuu 2010
- syyskuu 2010
- elokuu 2010
- heinäkuu 2010
- kesäkuu 2010
- toukokuu 2010
- huhtikuu 2010
- maaliskuu 2010
- helmikuu 2010
- tammikuu 2010
- joulukuu 2009




