Regular expressions in perl: verschil tussen versies

Uit wiki.openbomenkaart.org
Naar navigatie springen Naar zoeken springen
(Nieuwe pagina aangemaakt met 'Hier een intro over regular expressions in perl. Een eerste begin, later volgt meer. '''Regular expressions''' (vaak afgekort tot '''regexps''') zijn patronen voo...')
 
Regel 17: Regel 17:
  { doe iets anders }  
  { doe iets anders }  


''{ doe iets } hierna aan te duiden als {..} wat geen perl is ''
''{ doe iets } hierna aan te duiden als { .. } wat geen perl is ''


De ‘m’ voor de eerste slash geeft aan dat je alleen wilt ''matchen'' maar niets wilt veranderen. Anders zou er de ‘s’ van substitute staan.
De ‘m’ voor de eerste slash geeft aan dat je alleen wilt ''matchen'' maar niets wilt veranderen. Anders zou er de ‘s’ van substitute staan.
Regel 47: Regel 47:
Dus voorbeelden van een variable en wat er na de regexp in staat.
Dus voorbeelden van een variable en wat er na de regexp in staat.


  $dier = ‘aap’
  $dier = 'aap' ;
  $dier =~ s/aap/chimp/ ;  
  $dier =~ s/aap/chimp/ ;  


$dier bevat nu 'chimp'   
$dier bevat nu 'chimp'   


  $dier = ‘Aap’
  $dier = 'Aap' ;
  $dier =~ s/aap/chimp/ ;  
  $dier =~ s/aap/chimp/ ;  


$dier bevat nog steeds 'Aap'   
$dier bevat nog steeds 'Aap'   


  $dier = ‘schaap’
  $dier = 'schaap' ;
  $dier =~ s/aap/chimp/ ;  
  $dier =~ s/aap/chimp/ ;  


Regel 66: Regel 66:
Wil je dat de regexp ook matcht met 'Aap' dan eindig je de regexp met een extra 'i' (aansluitend) achter de laatste slash. Die staat voor ''case insensitive''.  
Wil je dat de regexp ook matcht met 'Aap' dan eindig je de regexp met een extra 'i' (aansluitend) achter de laatste slash. Die staat voor ''case insensitive''.  


  $dier = ‘Aap’
  $dier = 'Aap' ;
  $dier =~ s/aap/chimp/i ;  
  $dier =~ s/aap/chimp/i ;  


Regel 74: Regel 74:
Let op: die tekens betekenen alleen dit als ze aan het begin '^' of eind staan '$', anders betekenen ze wat anders.
Let op: die tekens betekenen alleen dit als ze aan het begin '^' of eind staan '$', anders betekenen ze wat anders.


  $dier = ‘schaap’
  $dier = 'schaap' ;
  $dier =~ s/^aap/chimp/ ;  
  $dier =~ s/^aap/chimp/ ;  


$dier bevat nog steeds 'schaap'
$dier bevat nog steeds 'schaap'


  $dier = ‘schaapherder’
  $dier = 'schaapherder' ;
  $dier =~ s/aap$/chimp/ ;  
  $dier =~ s/aap$/chimp/ ;  


$dier bevat nog steeds 'schaapherder', want de te vinden substring staat niet aan het einde van de string
$dier bevat nog steeds 'schaapherder', want de te vinden substring staat niet aan het einde van de string


  $dier = ‘aap ’
  $dier = 'aap ' ;
  $dier =~ s/aap$/chimp/ ;  
  $dier =~ s/aap$/chimp/ ;  


$dier bevat nog steeds 'aap ', want de string eindigt op een spatie
$dier bevat nog steeds 'aap ', want de string eindigt op een spatie

Versie van 18 jan 2024 04:45

Hier een intro over regular expressions in perl. Een eerste begin, later volgt meer.

Regular expressions (vaak afgekort tot regexps) zijn patronen voor tekstherkenning. Tekst in de ruimste zin van het woord. Dat kan ook een string met alleen cijfers of speciale tekens zijn.

Twee veel voorkomende toepassingen:

  1. om te checken of een patroon in een variabele voorkomt. Anders gezegd, is er een match? Resultaat is true of false.
  2. om een (deel van) een string door een andere string te vervangen, oftewel substitute. De string waar je de regexp op loslaat kan dus veranderen, maar alleen als het patroon precies matcht, precies aanwezig is.

match

Voorbeelden van matching:

Stel je wilt een variable testen als volgt.

if ($dier =~ m/aap/) 
{ doe iets }         
else
{ doe iets anders } 

{ doe iets } hierna aan te duiden als { .. } wat geen perl is

De ‘m’ voor de eerste slash geeft aan dat je alleen wilt matchen maar niets wilt veranderen. Anders zou er de ‘s’ van substitute staan.

Vaak wordt de ‘m’ weggelaten, die is default.

if ($dier =~ m/aap/) 
{ .. } 

Dit is dus hetzelfde:

if ($dier =~ /aap/) 
{ .. }

Het patroon staat normaal tussen forward slashes, maar je kan andere tekens gebruiken (als het patroon zelf veel slashes bevat is dat soms leesbaarder., maar bij hoge uitzondering).

if ($dier =~ /aap/) { .. }
if ($dier =~ #aap#) { .. } 

is dus hetzelfde. Maar is hier alleen verwarrend, want het patroon ‘aap’ bevat helemaal geen slashes. In 99% van de gevallen is de forward slash de norm.

substitute

Bij een substitute staat er eerst een patroon, dan aansluitend wat er voor in de plaats moet komen. In totaal dus 3 slashes.

$dier =~ s/aap/chimp/ ; 

Det zal matchen als $dier ‘aap’ bevat maar ook als dier ‘schaap’ bevat. Niet als dier ‘Aap’ bevat.

Dus voorbeelden van een variable en wat er na de regexp in staat.

$dier = 'aap' ;
$dier =~ s/aap/chimp/ ; 

$dier bevat nu 'chimp'

$dier = 'Aap' ;
$dier =~ s/aap/chimp/ ; 

$dier bevat nog steeds 'Aap'

$dier = 'schaap' ;
$dier =~ s/aap/chimp/ ; 

$dier bevat nu 'schchimp'

Het luistert dus nauw.

Wil je dat de regexp ook matcht met 'Aap' dan eindig je de regexp met een extra 'i' (aansluitend) achter de laatste slash. Die staat voor case insensitive.

$dier = 'Aap' ;
$dier =~ s/aap/chimp/i ; 

$dier bevat nu 'chimp'

Er zijn speciale tekens om aan te geven dat de match aan het begin van de string moet zijn: tilde, of aan het einde: dollar. Let op: die tekens betekenen alleen dit als ze aan het begin '^' of eind staan '$', anders betekenen ze wat anders.

$dier = 'schaap' ;
$dier =~ s/^aap/chimp/ ; 

$dier bevat nog steeds 'schaap'

$dier = 'schaapherder' ;
$dier =~ s/aap$/chimp/ ; 

$dier bevat nog steeds 'schaapherder', want de te vinden substring staat niet aan het einde van de string

$dier = 'aap ' ;
$dier =~ s/aap$/chimp/ ; 

$dier bevat nog steeds 'aap ', want de string eindigt op een spatie