Most recent comments
2021 in Books -- a Miscellany
Are, 2 years, 10 months
Moldejazz 2018
Camilla, 5 years, 3 months
Romjulen 2018
Camilla, 5 years, 10 months
Liveblogg nyttårsaften 2017
Tor, 6 years, 10 months
Selvbygger
Camilla, 3 weeks, 1 day
Bekjempelse av skadedyr II
Camilla, 9 months, 3 weeks
Kort hår
Tor, 3 years, 10 months
Ravelry
Camilla, 3 years, 5 months
Melody Gardot
Camilla, 5 years, 4 months
Den årlige påske-kommentaren
Tor, 5 years, 7 months
50 book challenge
Camilla, 10 months, 2 weeks
Controls
Register
Archive
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023

Regex med Tor

Regular expressions er, enkelt sagt, et verktøy man kan bruke til å søke etter tekst. Komplisert sagt er det en hele masse grafs med formelle språk og Chomsky-gramatikk og masse greier jeg aldri har giddet å sette meg inn i, utenom at jeg har fått med meg at HTML er en Chomsky-gramatikk av type 2, mens regular expressions er type 3, og derfor kan man ikke bruke regular expressions til å lese HTML. Og hvis du prøver vil russiske hackere pwne webappen din.

Så, regular expressions. Hvis du noen gang har brukt litt tid på å søke etter tekst i et dokument, er det ikke usannsynlig at du har ønsket du kunne regular expressions. For å ta et enkelt eksempel, la oss si at du har en lang tekst, og du ønsker å søke etter årstall, og at du ikke vet noe annet enn at det begynner på 1. Da kan du enten søke etter 1, som kan funke bra, men som også kan funke dårlig om det er mange tall i dokumentet du ser på. Hvis du derimot kan dine regular expressions, kan du bare søke etter
'1\d{3}'

\d er en regular expression som betyr siffer (d for digit), og {3} betyr at du søker etter 3 ganger det som står rett foran. Så du søker etter 1 etterfulgt av tre andre siffer.

Et annet eksempel kan være at du ønsker å finne enten 'mobilnummer' eller 'telefonnummer', eventuelt med stor forbokstav. Da kan du søke etter
'([Tt]elefon|[Mm]obil)nummer'

Firkantparantesene finner en av tingene som står inni den, så [Tt] finner enten 'T' eller 't'. Vanlig parantes brukes til å sette sammen ting i grupper, og | (pipe) betyr at du søker etter enten det som står foran, eller det som står bak. Så for eksempel T|telefon ville bety det samme som [Tt]elefon, mens (telefon|mobil) finner enten 'telefon' eller 'mobil'.

For å ta et litt mer søkt eksempel kan vi tenke oss at du ønsker å søke etter navnet på en eller annen skuespiller. Du husker ikke hva han heter til fornavn, men du husker at det var et kort navn, mellom fire og seks bokstaver, og du husker at det i alle fall ikke begynte på F eller K, og at det var et engelsk navn med ingen sære bokstaver. Da kan du søke etter
' [A-EG-IL-Z][a-z]{3,5} '

For eksempel A-E betyr alle store bokstaver fra A til E, ogsåvidere. Så [A-EG-IL-Z] finner en stor bokstav som ikke er F eller K. [a-z] finner en liten bokstav mellom a og z, og [a-z]{4,6} finner 4, 5 eller 6 små bokstaver. Og mellomrom (' ') finner mellomrom, så dermed finner du altså alle frittstående ord som begynner med en stor bokstav utenom F og K, og som har fra fire til seks bokstaver.

Hvis du er på utkikk etter et gresk eller latinsk ord, og du husker ikke hvilket, men det var definitivt et av de som begynner på 'ab' slutter på 'ion' eller 'oid', og det var neppe lengre enn 15 bokstaver totalt. Da kan du søke etter
'[Aa]b[a-z]{0,10}(ion|oid)'

En ting som er greit å legge merke til er at det er bra å angi at man ser etter 0 til 10 bokstaver i midten av ordet. Siden vi ikke vet hvor mange det er, kunne det kanskje virke naturlig å søke etter '[a-z]*', som finner et hvilket som helst antall bokstaver, men det er slett ingen god idé. Regular expressions er nemlig grådige, som betyr at det ønsker å finne det størte uttrykket som passer, så hvis du søkte i teksten
Abduction, in functional anatomy, is a movement which draws a limb away from the median (Sagittal) plane of the body. It is thus opposed to adduction.

ville du finne hele teksten, siden den begynner med 'Ab' og slutter på 'ion'.

Andre ting som kan være nyttige er linjeskift og tab. Sett at du søker i en txt-utgave av The Hitchhiker's Guide to the Galaxy, der du vet at alle avsnitt begynner på en ny linje med en tab som innrykk, og du leter etter et avsnitt som begynner med 'Ford Prefect'. Da kan du søke etter
'\n\r{0,1}\tFord Prefect'

Linjeskift er enten '\n', eller, av syke, historiske årsaker som har med printere å gjøre '\n\r'. Ved å søke etter '\n' etterfulgt av 0 eller 1 '\r' finner vi begge deler, og '\t' er tab.

Så, det var en kort introduksjon til regular expressions. For mer info, prøv google. Og forresten, jeg glemte å nevne at . finner alle tegn utenom linjeskift.

Ved en senere anledning: grep

-Tor Nordam
Are likes this

Comments

Huh

Camilla,  27.02.11 23:04

Greit å vite. Men jeg er ikke sikker på om jeg kommer til å kunne bruke det i praksis.
Category
Technology
Tags
regular expressions
unix
Views
4742
Last edited by
Tor, 27.02.11 23:06