Reguljära uttryck, regexpar

Nedan följer en kort introduktion till reguljära uttryck, regexpar. Notera att denna introduktion inte tar upp allt utan endast de viktigaste grunderna.

Regexpar kan användas till en massa olika program som grep, sed, awk, swatch etc.

Regexpar används för att matcha mot innehåll i en fil eller dataström. Observera att det är skillnad på stora och små bokstäver.

De grundläggande regexparna är:

Exempel på uttryck

Här följer lite exempel på uttryck.

Matcha alla förekomster av texten Gnuer med stor eller liten inledande bokstav.
[Gg]nuer

Matcha alla tomma rader.
^$

Matcha alla rader där det står error med stora eller små bokstäver.
[Ee][Rr][Rr][Oo][Rr]

Matcha alla rader som innehåller texten: <siffra> följt av gnuer.
[0-9]gnuer

Matcha alla rader som innehåller eventuellt någonting följt av bin följt av eventuellt någonting följt av sh.
.*bin.*sh

Matcha alla rader som börjar med mellan 7 och 17 st a eller A följt av ett b.
^[Aa]\{7,17\}b

Matcha alla rader som innehåller mer än 150 tecken (upprepning av vilka tecken som helst 150 gånger eller mer).
^.\{150,\}$

Matcha alla rader som innehåller ett eller många a följt av gnuer
a+gnuer

Matcha alla rader som börjar med inget eller ett a följt av gnuer
^a?gnuer

Tänk på att det är väldigt lätt att regexp-uttrycket matchar mer än vad du har tänkt dig.

Begränsa matching

I t.ex. Python och Perl går det att få regexputtryck att matcha på så lite som möjligt genom att lägga till ett frågetecken (?) efter ett matchningsmönster. Exempel: .*?

Ett sista exempel

För att få fram IP-adressen på ett nätverksinterface kan man använda ifconfig. Utmatningen innehåller ett antal rader men den rad som är intressant är den som ser ut enligt följande:
inet addr:213.114.25.242 Bcast:213.114.25.255 Mask:255.255.255.128
Med programmet sed går det att plocka ut den raden och sedan med ett reguljärt uttryck få ut IP-adressen. Det kan se ut enligt följande:
ifconfig eth0 | sed -n '/inet/s/^[ ]*inet addr:\([0-9.]*\).*/\1/p'

Programmet ifconfig visar all information om nätverksinterfacet eth0. Därefter får sed denna utmatning men är bara intresserad av raden med texten "inet". Det enkla reguljära uttrycket "inet", som står inom //, matchar exakt mot texten inet. Tecknet "s" som står mellan de reguljära uttrycken
inet och ^[ ]*inet addr:\([0-9.]*\).*
innebär att sed ska byta ut, substituera, en text mot en annan.

Det reguljära uttrycket ^[ ]*inet addr:\([0-9.]*\).* matchar mot rader som börjar med mellanslag och eller tab upprepat följt av inet addr: följt av siffor och punkter som upprepas och sparas (därav \( och \) ) följt av en upprepning av vilka tecken som helst. Allt detta ska ersättas med de sparade siffrorna och pukter, d.v.s. IP-adressen. Resultatet blir en IP-adress.

Copyright © 2010 Kjell Enblom.
This document is covered by the GNU Free Documentation License, Version 1.1