2. kodutöö: Java Regex
Selles kodutöös tutvume Java regulaaravaldise APIga. See on üsna praktiline ülesanne ja paljud tudengid leiavad, et see on üldse kõige kasulikum kodutöö meie aines. Mina ise ei arva nii, mistõttu eksamil me sellist ülesannet ei küsi. Meil on selles aines edaspidi palju lihtsamad regulaaravaldised, kuid laiendatud regulaaravaldised on mujal väga kasulikud. Kui tahad näiteks andmeid töödelda/korrastada, siis regexid on selleks parim töövahend. Seega, kui Sulle Java programmeerimise osa siin ei meeldi, siis keskendu rohkem regulaaravaldistele (kodutöö esimene osa) ja katseta neid regex101.com keskkonnas.
Eesmärk on defineerida klass week2.TextAnalyzer
, mille ülesanne on leida etteantud tekstist inimeste nimed ja nende telefoninumbrid. Klassi kasutamine näeks välja umbes nii:
package week2; public class TextAnalyzer { public static void main(String[] args) { String input = """ Mina olen Kalle Kulbok ja mu telefoninumber on 5556 4272. Mina olen Peeter Peet ja mu telefoninumber on 5234 567. Mari Maasikas siin, mu number on 6723 3434. Tere, olen Jaan Jubin numbriga 45631643."""; TextAnalyzer ta = new TextAnalyzer(input); Map<String, String> phoneBook = ta.getPhoneNumbers(); System.out.println(phoneBook.get("Peeter Peet")); // peab väljastama 5234567 System.out.println(phoneBook.get("Jaan Jubin")); // peab väljastama 45631643 System.out.println(ta.anonymize()); /* peab väljastama: Mina olen <nimi> ja mu telefoninumber on <telefoninumber>. Mina olen <nimi> ja mu telefoninumber on <telefoninumber>. <nimi> siin, mu number on <telefoninumber>. Tere, olen <nimi> numbriga <telefoninumber>. */ } }
Täpsustuseks:
- Võib eeldada, et ettentud tekstis esinevad inimeste nimed ja telefoninumbrid alati paarikaupa ja nimi on alati enne telefoninumbrit.
- Inimeste nimed kujutavad endast kahte järjestikust ladina tähtedest koosnevat sõna, kus kummagi sõna esimene täht on suurtäht ja ülejäänud väikesed. Seega võib eeldada, et inimesel on ainult üks eesnimi.
- Telefoninumbrid võivad koosneda ühest numbrigrupist või kahest omavahel tühiku või sidekriipsuga eraldatud numbrigrupist. (Soovitame kõigepealt keskenduda ainult tühikuga eraldatud juhtumitele ja üritada viimasest testist jagu saada, kui kõik muidu töötab.)
- Võib eeldada, et ühe joruna antud telefoninumbris on alati 4–8 numbrit ja kahe grupina antud numbri puhul on igas grupis 3–4 numbrit. Täispunktide saamiseks peate seda formaati täpselt jälgima, näiteks peaks telefoninumbri kätte saama lausest: "Juhan Juhanson on 72 aastat vana ja tema number on 737-8109".
- Võib eeldada, et iga nimi (st. eesnimi + perenimi) esineb vaid ühel korral, st. igale inimesele vastab vaid üks telefoninumber.
- NB! Selle kasutusnäide (ja testide põhjal) tuleb välja mõelda, kuidas telefoninumbrit korrastatakse!
Kui ülesanne vajab täpsustamist, siis küsige julgelt Zulip-is. Testide komplekt on üsna korralik, aga testimine on ainult esimene samm. Peaksite ise olema veendunud, miks lahendus on korrektne iga võimaliku sisendi korral.
Soojendusülesanded (need moodustavad osa kodutöö hindest!)
Kuna me tahaks, et kasutaksite lahendamiseks mõistlikult regulaaravaldisi, siis on ülesande lahendamiseks kõigepealt vaja mõned regulaaravaldised kirja panna. Neist viimaseid võiks ka põhikodutöö lahendamisel kasutada. Kirjuta klassi alguses olevate staatiliste muutujate väärtusteks sellised regulaaravaldised, millega sobituvad täpselt need sõned, mis on ülesande juures kirjeldatud.
- RE1: sõne lõppeb tähtedega "ed" või need tähed esinevad eelviimases positsioonis, näiteks "Ted", "edx" ja "need!".
- RE2: Paaritu pikkusega sõned!
- RE3: Sõned, mille esimene ja viimane sümbol on samad. Selleks tuleb siis kasutada tagasiviiteid! Mõtle ka erijuhtudele.
- NAME: See peaks sobituma üleval välja toodud lihtsate inimeste nimede tingimustele ehk ainult Eesnimi ja Perekonnanimi, nagu Vesal Vojdani, kes on väga lihtne inimene.
- NUMBER: Meie telefoninumbrid. Selleks on kaks testi, millest üks natuke lihtsamal kujul, kus sobivad kõik numbrijadad, mis võivad sisaldada ühe korra sidekriipsu, aga täpsem regex peaks siis tuvastama ainult õige pikkusega jupid.
NB! Siin mõtleme sobitumise all Java matcheri find meetodi rakendamist: see sobitub alamsõnedega, mistõttu tuleb kasutada õigetes kohtades sõne alguse ja lõpu erisümboleid.
Tingimused
- Lahenduse esitamine: https://moodle.ut.ee/mod/vpl/view.php?id=230002.
- Automaatse testimissüsteemi tõttu on oluline, et klassinimi ja implementeeritud meetodite signatuurid oleksid sellised nagu näidetes viidatud.
Video juhuks, kui jääd alustamisega hätta: Regexite kodutöö (spoiler!).