Difference between revisions of "Regular Expression Perl/introduktion"

From Teknologisk videncenter
Jump to: navigation, search
m (Foskellige bogstaver på samme tegnplads)
m (Stjerne *)
 
(3 intermediate revisions by the same user not shown)
Line 33: Line 33:
 
</source>
 
</source>
 
jensine matcher ikke da det starter med et lille j.
 
jensine matcher ikke da det starter med et lille j.
=== Ignorer store/små bogstaver ===
+
== Ignorer store/små bogstaver ==
 
For at ignorere case på bogstaver - altså store/små - kan '''i''' modifieren anvendes. ''/Jens/'''i'''''
 
For at ignorere case på bogstaver - altså store/små - kan '''i''' modifieren anvendes. ''/Jens/'''i'''''
 
<source lang=perl>
 
<source lang=perl>
Line 58: Line 58:
 
jensine Matcher
 
jensine Matcher
 
</source>
 
</source>
=== Forskellige bogstaver på samme tegnplads ===
+
== Forskellige bogstaver på samme tegnplads ==
 
Hvis flere forskellige bogstaver kan være på samme sted kan der anvender ''Character Classes''. '''[ck]''' i eksemplet herunder betyder at bogstaver '''c''' eller bogstavet '''k''' skal stå på denne position.
 
Hvis flere forskellige bogstaver kan være på samme sted kan der anvender ''Character Classes''. '''[ck]''' i eksemplet herunder betyder at bogstaver '''c''' eller bogstavet '''k''' skal stå på denne position.
 
<source lang=perl>
 
<source lang=perl>
Line 71: Line 71:
 
Mikael
 
Mikael
 
Mille
 
Mille
 +
Sille
 
Michael
 
Michael
 
Mikkel
 
Mikkel
Line 81: Line 82:
 
Mikael Matcher
 
Mikael Matcher
 
Mille Matcher ikke!
 
Mille Matcher ikke!
 +
Sille Matcher ikke!
 
Michael Matcher
 
Michael Matcher
 
Mikkel Matcher
 
Mikkel Matcher
Line 88: Line 90:
 
</source>
 
</source>
 
Hvad vil der ske hvis Regexp udtrykket blev ændret fra '''/Mi[ck]/i''' til '''/Mi[ck][AHK]/i'''. Prøv det evt.
 
Hvad vil der ske hvis Regexp udtrykket blev ændret fra '''/Mi[ck]/i''' til '''/Mi[ck][AHK]/i'''. Prøv det evt.
=== Punktum kan betyde alle tegn ===
+
== Punktum kan betyde alle tegn ==
 
Punktummet '''.''' er et specialtegn som kan betyde alle tegn (undtaget ''\n'' nylinietegnet.) Se eksempel herunder.
 
Punktummet '''.''' er et specialtegn som kan betyde alle tegn (undtaget ''\n'' nylinietegnet.) Se eksempel herunder.
 
<source lang=perl>
 
<source lang=perl>
Line 101: Line 103:
 
Mikael
 
Mikael
 
Mille
 
Mille
 +
Sille
 
Michael
 
Michael
 
Mikkel
 
Mikkel
Line 111: Line 114:
 
Mikael Matcher
 
Mikael Matcher
 
Mille Matcher ikke!
 
Mille Matcher ikke!
 +
Sille Matcher ikke!
 
Michael Matcher ikke!
 
Michael Matcher ikke!
 
Mikkel Matcher
 
Mikkel Matcher
Line 118: Line 122:
 
</source>
 
</source>
 
Hvis regexp udtrykket i eksemplet '''/Mi[ck].e/i''' blev ændret til '''/Mi[ck].[ae]/i''', hvad ville så matche. (Prøv evt.)
 
Hvis regexp udtrykket i eksemplet '''/Mi[ck].e/i''' blev ændret til '''/Mi[ck].[ae]/i''', hvad ville så matche. (Prøv evt.)
=== Quantifiers ===
+
== Quantifiers ==
 +
=== Stjerne * ===
 +
Stjernen '''*''' betyder at foregående ''atom'' matcher hvis den er der nul eller flere gange. Rexexp udtrykket '''/Mic*k/i''' betyder at der skal stå '''Mi''' efterfulgt af nul eller flere c'er '''*c''' og så skal der komme et '''k'''.
 +
<source lang=perl>
 +
while ( chomp(my $line = <DATA>) ) {
 +
  if ( $line =~ /Mic*k/i ) {
 +
    print "$line Matcher\n";
 +
  } else {
 +
    print "$line Matcher ikke!\n";
 +
  }
 +
}
 +
__DATA__
 +
Mikael
 +
Mille
 +
Sille
 +
Michael
 +
Mikkel
 +
Minnie
 +
Michelle
 +
Mikkelsen
 +
Michk 
 +
</source>
 +
Output fra scriptet
 +
<source lang=text>
 +
Mikael Matcher
 +
Mille Matcher ikke!
 +
Sille Matcher ikke!
 +
Michael Matcher ikke!
 +
Mikkel Matcher
 +
Minnie Matcher ikke!
 +
Michelle Matcher ikke!
 +
Mikkelsen Matcher
 +
Michk Matcher ikke!
 +
</source>
 +
 
 +
=== Plustegn + ===
 +
=== Spørgsmålstegn ? ===
 +
=== tuborgparanteser { } ===
 +
[[category:Perl]]

Latest revision as of 16:53, 28 February 2010

Regular expressions - eller Regexp - er et værktøj indbygget i mange programmeringssprog, men er mest berømt på Perl.

Formål med Regexp

Regexp er beregnet til at søge i tekstbaseret data. For eksempel logfiler, output fra enheder.

Hvem skal læse dette dokument

Hvis du har lidt indblik i Perl og forstår den generelle syntax, vil du sandsynligvis få noget ud af dette dokument.

Regexp syntax

Regexp er tegnbaseret og der er derfor en del tegn og sekvenser der skal huskes udenad. Et godt råd er at printe dette Regular Expression Quick Reference Guide og bruge det til at dechifrere udtrykkene.

Simpel tekstsøgning

Scriptet herunder benytter sig af en indbygget funktion i Perl man blandt andet kan bruge til udvikling af Perl programmer. Det er normalt irreterende at skulle taste de samme data ind fra tastaturet med <STDIN> håndtaget når man skal teste sit program. Det er muligt at bruge håndtaget i stedet for og så nederst i filen have et __DATA__ felt. (2 x underscore, DATA, 2 x underscore>)

while ( chomp(my $line = <DATA>) ) {
  if ( $line =~ /Jens/ ) {
    print "$line Matcher\n";
  } else {
    print "$line Matcher ikke!\n";
  }
}
__DATA__
Jens
Ole
Hans
Jensen
jensine

Outputtet fra scriptet er

Jens Matcher
Ole Matcher ikke!
Hans Matcher ikke!
Jensen Matcher
jensine Matcher ikke!

jensine matcher ikke da det starter med et lille j.

Ignorer store/små bogstaver

For at ignorere case på bogstaver - altså store/små - kan i modifieren anvendes. /Jens/i

while ( chomp(my $line = <DATA>) ) {
  if ( $line =~ /Jens/i ) {
    print "$line Matcher\n";
  } else {
    print "$line Matcher ikke!\n";
  }
}
__DATA__
Jens
Ole
Hans
Jensen
jensine

Outputtet fra scriptet er

Jens Matcher
Ole Matcher ikke!
Hans Matcher ikke!
Jensen Matcher
jensine Matcher

Forskellige bogstaver på samme tegnplads

Hvis flere forskellige bogstaver kan være på samme sted kan der anvender Character Classes. [ck] i eksemplet herunder betyder at bogstaver c eller bogstavet k skal stå på denne position.

while ( chomp(my $line = <DATA>) ) {
  if ( $line =~ /Mi[ck]/i ) {
    print "$line Matcher\n";
  } else {
    print "$line Matcher ikke!\n";
  }
}
__DATA__
Mikael
Mille
Sille
Michael
Mikkel
Minnie
Michelle
Mikkelsen

Output fra ovenstående script:

Mikael Matcher
Mille Matcher ikke!
Sille Matcher ikke!
Michael Matcher
Mikkel Matcher
Minnie Matcher ikke!
Michelle Matcher
Mikkelsen Matcher

Hvad vil der ske hvis Regexp udtrykket blev ændret fra /Mi[ck]/i til /Mi[ck][AHK]/i. Prøv det evt.

Punktum kan betyde alle tegn

Punktummet . er et specialtegn som kan betyde alle tegn (undtaget \n nylinietegnet.) Se eksempel herunder.

while ( chomp(my $line = <DATA>) ) {
  if ( $line =~ /Mi[ck].e/i ) {
    print "$line Matcher\n";
  } else {
    print "$line Matcher ikke!\n";
  }
}
__DATA__
Mikael
Mille
Sille
Michael
Mikkel
Minnie
Michelle
Mikkelsen

Output fra ovenstående script

Mikael Matcher
Mille Matcher ikke!
Sille Matcher ikke!
Michael Matcher ikke!
Mikkel Matcher
Minnie Matcher ikke!
Michelle Matcher
Mikkelsen Matcher

Hvis regexp udtrykket i eksemplet /Mi[ck].e/i blev ændret til /Mi[ck].[ae]/i, hvad ville så matche. (Prøv evt.)

Quantifiers

Stjerne *

Stjernen * betyder at foregående atom matcher hvis den er der nul eller flere gange. Rexexp udtrykket /Mic*k/i betyder at der skal stå Mi efterfulgt af nul eller flere c'er *c og så skal der komme et k.

while ( chomp(my $line = <DATA>) ) {
  if ( $line =~ /Mic*k/i ) {
    print "$line Matcher\n";
  } else {
    print "$line Matcher ikke!\n";
  }
}
__DATA__
Mikael
Mille
Sille
Michael
Mikkel
Minnie
Michelle
Mikkelsen
Michk

Output fra scriptet

Mikael Matcher
Mille Matcher ikke!
Sille Matcher ikke!
Michael Matcher ikke!
Mikkel Matcher
Minnie Matcher ikke!
Michelle Matcher ikke!
Mikkelsen Matcher
Michk Matcher ikke!

Plustegn +

Spørgsmålstegn ?

tuborgparanteser { }