regexid elus - ut › mtat.05.085 › 2016_spring › uploads › main › l2-vesal.pdfpunkt on...
TRANSCRIPT
![Page 1: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/1.jpg)
Regexid ElusVesal Vojdani
(TÜ Arvutiteaduse Instituut)
![Page 2: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/2.jpg)
TeisendusPerekonnanimi, Nimi → Nimi Perekonnanimi
![Page 3: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/3.jpg)
Capturing Groups
• Tihti on sõnes alamrühmitusi vaja kätte saada.
• Rühmitamine: “Vene, Varmo” → “(Vene)1, (Varmo)2”
• Väljastamine: “\2 \1”
• Näiteks: sed -E 's/(.*), (.*)/\2 \1/'
![Page 4: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/4.jpg)
Capturing Groups
• Tihti on sõnes alamrühmitusi vaja kätte saada.
• Rühmitamine: “Vene, Varmo” → “(Vene)1, (Varmo)2”
• Väljastamine: “\2 \1”
• Näiteks: sed -E 's/(.*), (.*)/\2 \1/'
Punkt on kõik tähestiku tähed
![Page 5: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/5.jpg)
Capturing Groups
• Tihti on sõnes alamrühmitusi vaja kätte saada.
• Rühmitamine: “Vene, Varmo” → “(Vene)1, (Varmo)2”
• Väljastamine: “\2 \1”
• Näiteks: sed -E 's/(.*), (.*)/\2 \1/'
Punkt on kõik tähestiku tähed
Kõik tähed enne koma
Kõik tähed koma järel
![Page 6: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/6.jpg)
Word: “Use Wilcards”(Advanced Find & Replace…)
![Page 7: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/7.jpg)
Peaaegu…Ma ei oska Wordile selgitada, et võtaks terve rida.
Selleks on muidu operaatorid ^ ja $.
![Page 8: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/8.jpg)
Proovime Javaga
• Java regexite teek on java.util.regex
• Nende funktsionaalsus on ka otse sõnede kaudu kättesaadavad.
• str.split(regex) = Pattern.compile(regex).split(str)
str.split(“,”) on aga kiirem. (fast-track lihtsate juhtumite jaoks)
![Page 9: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/9.jpg)
Java koodline.replaceAll("(.*), (.*)", "$2 $1")
public class Demo { public static void main(String[] args) throws IOException { Path path = Paths.get(args[0]); Files.lines(path).forEachOrdered(Demo::printline); } private static void printline(String line) { String edited = line.replaceAll("(.*), (.*)", "$2 $1"); System.out.println(edited); }}
![Page 10: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/10.jpg)
Sõne tükeldamine
• Oletame, et meil on vaja rühmitada tärniga eraldatud sõnu.
• “üks *kaks * kolm” → [“üks”, “kaks”, “kolm”]
• Selleks on split() meetod.
• Peame lihtsalt kirjutama str.split("*")?
![Page 11: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/11.jpg)
Sõne tükeldamine
• Oletame, et meil on vaja rühmitada tärniga eraldatud sõnu.
• “üks *kaks * kolm” → [“üks”, “kaks”, “kolm”]
• Selleks on split() meetod.
• Peame lihtsalt kirjutama str.split("*")?
Exceptionin thread "main"
java.util.regex.PatternSyntaxException:Dangling metacharacter '*'
near index 0
![Page 12: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/12.jpg)
Maskeerimistähed!? (Escape characters / Maskierungszeichen)
• Regulaaravaldiste “kompilaatori” jaoks on tärn erilise tähendusega.
• Kui me lihtsalt tahame seda sümbolit regexis kasutada, siis peab kaldkriips ette panema.
• Proovime str.split("\*").
• Nüüd Java viriseb: illegal escape character :(
![Page 13: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/13.jpg)
System.out.println(" ??? ")
• Midagi tuleks kirjutada küsimärkide asemele, et ekraanile ilmuks järgmist kaks tähte:
\* • Sest selline peaks olema sisend regexi
kompilaatorile!
![Page 14: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/14.jpg)
IDE on abiks…
• Kellel on IntelliJ võib lihtsalt seda teksti lõigata ja jutumärkide vahele kleepida.
• Eclipse’il on kuskil seadistus “Escape text when pasting into a string literal”
![Page 15: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/15.jpg)
str.split("\\*")• Me üritame Java literaalina kirja panna regex
kompilaatori sisend.
• Temal oli vaja maskeeritud sisend, aga Java vajab omakorda kaldkriipsude maskeerimist…
• Oluline on meeles pidada, et “\\*” koosneb kahest tähest ja kehtib
"\\*".charAt(0) == '\\'
![Page 17: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/17.jpg)
Teine katse
• “üks *kaks * kolm” → [“üks”, “kaks”, “kolm”]
• Meil oleks vaja whitespace ka eraldajaks.
• Selleks on spetsiaalne grupp ‘\s’.
• Meil on vaja regex \s*\*\s* Java literaalina.
![Page 18: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/18.jpg)
[“üks”, “kaks”, “kolm”]str.split("\\s*\\*\\s*")
![Page 19: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/19.jpg)
Sõne tükeldamine II
• Oletame, et meil on vaja rühmitada tärniga eraldatud sõnu, aga tärn peaks jääma alles.
• “üks *kaks * kolm” → [“üks”, “*”, “kaks”, “*”, “kolm”]
• Siin võite valida, kas eelistame lihtne või keeruline lahendus?
![Page 20: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/20.jpg)
Lihtne lahendus• String str = “üks *kaks * kolm”
• Me võiks proovida str.split("\\s*")
Siin võiks ise javarepl’is järgi proovida!
![Page 21: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/21.jpg)
Lihtne lahendus• String str = “üks *kaks * kolm”
• Me võiks proovida str.split("\\s*")
• Proovime siis str.split("\\s+")
![Page 22: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/22.jpg)
Lihtne lahendus• String str = “üks *kaks * kolm”
• Me võiks proovida str.split("\\s*")
• Proovime siis str.split("\\s+")
• See on parem, aga [“üks”, “*kaks”, “*”, “kolm”]
![Page 23: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/23.jpg)
Lihtne lahendus• String str = “üks *kaks * kolm”
• Me võiks proovida str.split("\\s*")
• Proovime siis str.split("\\s+")
• See on parem, aga [“üks”, “*kaks”, “*”, “kolm”]
• Kui ainult oleks tärni ümber alati tühikud…
![Page 24: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/24.jpg)
Lihtne lahendus• String str = “üks *kaks * kolm”
• Me võiks proovida str.split("\\s*")
• Proovime siis str.split("\\s+")
• See on parem, aga [“üks”, “*kaks”, “*”, “kolm”]
• Kui ainult oleks tärni ümber alati tühikud… Äkki leidub mõni meetod stiilis
asenda(“*”, “ * ”)?
![Page 25: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/25.jpg)
Raskem Lahendus• Kui tahame ainult ühe regexiga seda teha?
(See on tegelikult väga raske!!)
• Lookahead: (?=\\*)
• Lookback: (?<=\\*)
• Proovige näiteks sisendit “Test **123”niimoodi tükeldada, et saaks [“Test”, “*”, “*”, “123”]
• Kasuks võib tulla ‘\b’…
![Page 26: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/26.jpg)
Kuidas split töötab?• Peame meeles, et “a; ;b;;c”.split(“;”) tulemus
võiks olla [“a”, “ ”, “b”, “”, “c”]
• “Test **123”.split(“\\s*(?=\\*)”) arvutamisel otsime järjest, kus muster sobitub.
• Esimene match: “Test[ ]**123”, siis võtame “Test” üheks jupiks ja jätkame sõnega “**123”.
• Segaseks teeb n.n. “zero-width match”: []**12
![Page 27: Regexid Elus - ut › MTAT.05.085 › 2016_spring › uploads › Main › l2-vesal.pdfPunkt on kõik tähestiku tähed Kõik tähed enne koma Kõik tähed koma järel. Word: “Use](https://reader034.vdocuments.pub/reader034/viewer/2022042408/5f23cbdd98bf2e58da663ab0/html5/thumbnails/27.jpg)
Boonusülesanne: Split(“a*”)Miks “ab” tükeldatakse nii, et on kaks tühja sõne, aga
“bab” korral ainult üks ja “b” korral mitte ühtegi???