perl_128px.png

REGULJÄRA UTTRYCK

(regular expressions)

Det mest grundläggande reguljära uttrycket består av ett enda bokstav t.ex. a. Det kommer att matcha den första förekomsten av tecknet i strängen. Om strängen är "Hans är en apelsin", kommer det att matcha det första a:et efter bokstaven H.

Detta reguljära uttryck kan matcha den andra a:et i "apelsin" också. Det kommer bara göra det när du säger till regex motorn för att börja söka igenom strängen efter den första matchen. I en textredigerare kan du göra det genom att använda sin "Sök nästa"eller"Sök framåt"-funktion. I ett programmeringsspråk, finns det oftast en separat funktion som du kan använda för att fortsätta söka igenom strängen efter den föregående matchningen.

Det finns tretton tecken med speciella betydelser:

  1. [ hakparentes (öppnande)
  2. ] hakparentes (stängande)
  3. \ omvänt snedstreck eller backslash
  4. ^ caret
  5. $ dollartecknet
  6. . punkt
  7. | lodrätt streck, vertikalstreck eller pipa
  8. ? frågetecknet
  9. * asterisken eller en stjärna
  10. ? frågetecken
  11. + plustecknet
  12. ( parantes (öppnande)
  13. ) parantes (stängande)

Dessa specialtecken kallas ofta för "metatecken".

Om du vill använda någon av dessa tecken som en bokstavligt tecken i ett reguljärt uttryck, måste du föregå dem med ett omvänt snedstreck (backslash). Om du vill matcha "1+1=2" är den korrekta regex "1\+1=2". Annars kommer plustecknet har en speciell innebörd.

\" matchar "
\$ matchar $
\* matchar *

Parenteser använd för att gruppera uttryck om vi vill att parenteser skall matcha måste vi använda tecknet \( utryck\).

* Matcha 0 gånger eller mer
+ Matcha 1 gång eller mer
? Matcha 0 eller 1 gång
{n} Matcha exakt 'n' gånger
{n,} Matcha minst 'n' gånger
{n,m} Matcha minst 'n' gånger och högst 'm' gånger
? eller . Matchar ett enstaka tecken
[xxx] eller [x-x] Matchar tecken eller en räcka tecken
^sträng Matchar i början av en rad
sträng$ Matchar i slutet av en rad

HAKPARANTESER

[ och ] används för att matcha något av flera möjliga tecken. [ab]* matchar a, b, aa, bb, ab, ba, osv.

Matchning av en hel serie av tecken.

[a-zåäö] Matchar alla tecken i alfabetet
[a-zåäöA-XÅÄÖ] Matchar stora och små bokstäver i alfabetet.
[0-9,]* Matchar strängar av siffror och kommatecken

Innanför hakparanteserna blir de speciella tecknen , . *, + precis vad de är, dock ej hakparantesen själv.

[*+()\[\]] Matchar *, +, (, ), [, ]

Om det första tecknet i en hakparantes är ^, så blir betydelsen av hakparantesen den omvända. Parentesen matchar då alla tecken som inte finns uppräknade i parentesen. Om den inte står först förlorar den sin speciella betydelse.

[^ ]* Matchar allt fram till nästa mellanslag
[\^] Matchar ^
[^^]* Matchar allt fram till nästa ^
"[^"]*" Matchar citerade strängar ( kan också skrivas ".*?" )
<[^>]*> Matchar HTML-taggar (kan också skrivas <.*?>)

MÖNSTER (PATTERNS)

\t tabb (HT, TAB)
\s matchar tomrumstecken (tabbar, mellanslag, ny rad, mm)
\S matchar alla tecken som inte \s matchar
\n ny rad (newline (LF, NL))
\r returmatning (return)
\w matchar ordtecken, tecken som räknas som en del av ett ord
\W matchar alla tecken som \w inte matchar
\d matchar en siffra (0-9)
\D matchar alla tecken som inte är en siffra
$x matchar innehållet i variabeln $x
\$x matchar $x
\d$x\d matchar innehållet i variabeln $x omgivet av siffror
\b matchar ordgräns (\bbanan\b)
\B matchar allt som inte är en ordgräns
\A matchar början av strängen
\Z matchar slutet av strängen
\G matchar där den senaste matchningen slutade

(Observera att alla dessa koder bara matchar ett tecken vardera. Om vi vill matcha ett helt ord måste vi skriva \w+)

Matcha en viss possition

Några fler speciella variabler användbara vid sökning:

$+ $LAST_PAREN_MATCH Innehåller det senast matchade deluttrycket.
$& $MATCH Innehåller hela den matchade strängen.
$` $PREMATCH Innehåller allting före den matchade strängen.
$' $POSTMATCH Innehåller allting efter den matchade strängen.
${^POSTMATCH} - Detta liknar $'($POSTMATCH) förutom att den inte har några prestanda förluster som är förknippad med den variabeln, och garanterar att returnera ett fastställt värde när mönstret kompilerades eller kördes med /p modifieraren.
$^N $LAST_SUBMATCH_RESULT Främst används denna inuti (?{...}) block för att pröva nyligen matchad text. Till exempel, för att effektivt hitta text till en variabel (i tillägg till $ 1, $ 2 osv), byt (...) med ...

Misc

\033 oktalt tecken, matchar tecknet med det oktala värdet 33
\x1b hexadecimalt tecken, matchar tecknet med det hexadecimala värdet 1b
\f form feed (FF)
\a alarm (bell) (BEL)
\e escape (tänk troff) (ESC)
\c[ control char
\l lowercase next char (tänk vi)
\u uppercase next char (think vi)
\L lowercase till \E (think vi)
\U uppercase till \E (think vi)
\E end case modification (think vi)
\Q quote (disable) pattern metacharacters till \E

OPPERATORER FÖR REGULJÄRA UTTRYCK

SYNTAX:

=~ binder en sträng uttryck för ett mönster match, substitution, eller transkription (löst kallas översättning)

eller

!~

Praktiskt exempel på matchning

$string =~ /regular expression/expression modifier

eller

string =~ operator/sök/ersätt_med/modifierare;

Eller för att inte matcha

string !~ operator/sök/ersätt_med/modifierare;

$sentence innehåller en massa ord och vi letar efter "Hello"

$sentence =~ /Hello/;

ERSÄTTNINGS-OPPERATORN (s)

Ersäter "Korv" med "Bulle" (variabeln $x innehåller en massa ord och meningar)

$x =~ s/Korv/Bulle/;

Raderar en HTML-tagg

$x =~ s/<.*?>//;

Ersätter å med &aring;

$x =~ s/å/&aring;/;

Ersätter datumformen "95-12-14" med "951214"

$x =~ s/^(\d\d)-(\d\d)-(\d\d)/$1$2$3/;

Den sista operatorn är översättnings-operatorn som skrivs 'tr' (translation) eller 'y' (yank). Den används för att översätta tecknen, ett åt gången, och är egentligen mycket enklare än s- och m- operatorerna. När vi utför en översättning ersätts varje tecken i sökmönstret med tecknet som står på motsvarande plats i ersättningsmönstret. Operatorn returnerar antalet tecken som matchade sökmönstret. Precis som innanför hakparanteserna kan vi använda tecknet '-' för att ange en serie an tecken.

Gör om stora- till små bokstäver

$x =~ tr/A-ZÅÄÖ/a-zåäö/;

Eftersom 'tr' bara översätter tecken för tecken så är modifierare så som *, +, ?, mm meningslösa. När vi använder dessa tecken i 'tr' så tolkas de alltid bokstavligt. Det enda speciella tecknet är '-' som indikerar att vi menar en serie som skall översättas samt '\' som kodar speciella tecken (-, \ och /).
Om ersättningslistan är kortare än söklistan så förlängs den automatiskt genom att det sista tecknet upprepas så många gånger som behövs.

Ersätt "0" med "x "samt alla andra siffror med "y"

$x =~ tr/0-9/xy/;

Om ersättningslistan är helt tom så görs inga ersättningar. Eftersom översättnings-operatorn returnerar antalet tecken i strängen som matchar över sättningsmönstret kan vi använda detta för att räkna antalet tecken av en viss typ.

Räkna antalet siffror i $x:

$antal = ($x =~ tr/0-9//);

Räkna antalet ben i manniskokroppen

$antal = ($manniskokroppen =~ tr/b//);

 

MODIFIERARE (längst bak i regex)

i Gör sökningen case-insensitive
g Global matchning
m Om strängen har ett rad-brytningstecken kommer inte metatecknen ~ och $ att fungera korrekt. Denna modifierare talar om för Perl att behandla en rad som flera rader.
s Tecknet . matchar alla tecken utom en ny rad. Denna modifierare behandlar denna rad som en rad, som tillåter . att matcha ett radbrytnings tecken.
x Tillåter mellanslag (whitespace) i uttrycket

Exempel: Leta efter Hello (case-incesitive)

$sentence =~ /"Hello"/i;

MODIFIERARE FÖR 'tr'

c Invertera söksträngen (complement)
d Radera tecken som inte matchar (delete)
s Kläm ihop ersatta tecken (squash)

Exempel:

Ersätter alla tecken utom de alfabetiska med mellanslag

$string =~ tr/A_Za-zÅÄÖåäö/ /c;

Radera alla siffror

$string =~ tr/0-9//d;

Radera alla tecken utom de alfabetiska

$string =~ tr/A-Za-zÅÄÖåäö//cd;

Ersätt alla följder av icke-alfabetiska tecken med ett mellanslag

$string =~ tr/A_Za-zÅÄÖåäö/ /cs;

METATECKEN

\ Talar om för Perl att acceptera följande tecken så som det är, detta tar bort ev andra betydelser som tecknet kan ha.
~ Matchar början av strängen, om inte /m används för att modifiera uttrycket.
. Matchar alla tecken utom radbrytnings tecken finns i strängen, så tillvida inte /s används för att modifiera uttycket.
$ Matchar slutet av strängen, om inte /m används för att modifiera uttrycket.
^ Matchar början av strängen
=~ Träff
!~ Ingen träff
| Utrycker variation. Detta betyder att uttrycket kommer att söka efter multipla mönster i samma sträng. (Den bitvisa eller-operatorn.)
() Grupperar uttryck för att i variation och åter referering.
[] Letar efter ett set av tecken.

 

Gruppera

$string =~ s/(exp1)(exp2)(exp3)/$2/

Accessen till de grupperade uttrycken (paranteser) sker genom exp1=$1, exp2=$2 och exp3=$3

 

Länkar

http://perldoc.perl.org/perlvar.html

http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlre.html

 


"regular-expressions", Hans E Andersson: 2005-09-05 15:09:13, ändrad: 2012-08-15 02:12:56

 

Copyright © 2005 - 2024 HEAP. Alla rätter förbehållna. Integritetspolicy