Christian Seiler: Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Beitrag lesen

Hallo Siechfred,

/(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

Ja, das Prinzip ist mir schon klar, aber ich verstehe den Sinn von Lookbehind nicht. Das würde man nämlich (in Perl) auch so erreichen: '/(?!ASP) ist toll/'.

Nein, würde man nicht. Beispiel:

#!/usr/bin/env perl  
  
use strict;  
use warnings;  
  
my ($text, $match1, $match2);  
  
$text = "Hallo, ASP ist toll!";  
  
$match1 = $text =~ /(?!ASP) ist toll/;  
$match2 = $text =~ /(?<!ASP) ist toll/;  
  
print "Match 1: " . $match1 . "\n";  
print "Match 2: " . $match2 . "\n";

Ausgabe:

Match 1: 1
Match 2:

Match 1 matcht den String, weil "(?!ASP) is" *immer* matcht. (" is" ist natürlich nicht das gleiche, wie "ASP") - (?!) ist eben eine Look-AHEAD-Assertion. Du brauchst hier aber eine Look-BEHIND-Assertion - was (?<!) eben leistet - deswegen matcht der 2. Ausdruck nichts. Klar?

Wenn ich das Ganze mal teste, funktioniert es:

Ja, weil \b etwas besonderes ist; bei \b ist es Quatsch, das in eine Assertion reinzutun, weil es selbst schon gleichzeitig eine Lookahead/Lookbehind-Assertion ist! (je nach Kontext)

Viele Grüße,
CHristian