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:
- Bokstav eller siffra och många av övriga tecken är sig själva. Ett "a" är ett a.
- ^ innebär början på en rad.
- $ innebär slutet av en rad.
- . ett tecken vilket som helst.
- [] Ett tecken men inte vilket som helst utan ett av de som räknas upp i mängden. En mängd kan skrivas som de tecken som ska ingå i mängden. Exempel: [abcdefg] innebär att tecknet ska vara något av a, b, c, d, e, f eller g. En uppräkning kan skrivas som start-slut. Exempel: [a-z] motsvarar ett tecken som ska vara en liten bokstav från a till z. Om - ska ingå i mängden ska den skrivas sist. Exempel: [a-z-]. För att tala om att ett tecken ska vara en stor eller liten bokstav måste du skriva dessa två inom []. Exempel: [Ff] ger ett stort eller litet f.
- * upprepning av tecknet eller uttrycket till vänster ingen eller hur många upprepningar som helst. Exempel: f* innebär inga eller hur många "f" som helst.
- + upprepning av tecknet eller uttrycket till vänster en eller hur många upprepningar som helst. Exempel: f+ innebär ett eller hur många "f" som helst.
- ? upprepning av tecknet eller uttrycket till vänster ingen eller en gång. Exempel: f? innebär inget eller ett "f".
- \{,tal\} upprepning av tecknet eller uttrycket till vänster inga eller upp till och med <tal> gånger. Exempel: f\{,17\} innebär inga eller upp till och med 17 st "f".
- \{tal,\} upprepning av tecknet eller uttrycket till vänster <tal> gånger eller fler. Exempel: f\{150,\} innebär 150 eller fler stycken "f".
- \{tal1,tal2\} upprepning av tecknet eller uttrycket till vänster mellan <tal1> och <tal2> gånger. Exempel: f\{7,17\} innebär mellan 7 och 17 stycken "f".
- uttryck1 | uttryck2 innebär antingen uttryck1 eller uttryck2. Exempel:a | b innebär ett a eller ett b. a+ | b+ innebär ett eller fler a eller ett eller fler b.
- \tecken ger tecknet. Används för att tecken som annars används som specialtecken. Exempel: \. ger en punkt. \\ ger tecknet \ .
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-2024
Kjell Enblom.
This document is covered by the GNU Free Documentation License, Version 1.3
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".