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

Beitrag lesen

Hallo Siechfred,

$text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

Ich werde die Lookbehind-Konstrukte auch noch irgendwann kapieren :-/

So schwer ist das auch nicht:

(?<!TEXT) ist eine negative lookbehind assertion. Die sorgt dafür, dass _vor_ dem String, der gematcht wird, TEXT *nicht* vorkommen darf. Allerdings matcht (?<!TEXT) nicht auf TEXT, d.h. die Länge der Assertion ist 0 und TEXT ist somit *nicht* Teil des gesamten gematchten Strings.

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

Das Gegenteil davon ist die lookbehind assertion:

/(?<=Perl) ist toll/ findet die Zeichenkette " ist toll" - aber nur dann, wenn "Perl" davorsteht.

Genauso gibt es lookahead assertions:

/Du bist (?!doof)/ findet die Zeichenkette "Du bist " sofern da *nicht* "doof" dahinter steht.

/Du bist (?=ein Freak)/ findet die Zeichenktte "Du bist " - aber nur dann, wenn "ein Freak" dahinter steht.

Diese Assertions können auch in anderen Situationen nützlich sein. Du willst bspw. jedes Wort finden, das fünf Buchstaben hat aber *nicht* Linux ist:

$text =~ /\b(?!Linux)(\w{5})\b/

(\b ist die Wortgrenze)

Viele Grüße,
Christian