kniffeliger RegEx
Johnny B.
- perl
Hallo geehrtes Forum,
ich will mittels eines RegEx Ausdrücke in einem Text markieren. Das funktioniert auch wie gewünscht, bis auf eine Ausnahme: wenn ein Ausdruck mit einem bereits markierten Ausdruck überlappt.
So wird markiert:
my $mark1 = '<span style="color:blue">';
my $mark2 = '</span>';
foreach my $word ( @markwords ) {
$text =~ s/$word/$mark1$word$mark2/gmsi;
}
Wenn jetzt in einem Text bereits der Ausdruck 'Italiener um die Ecke' markiert ist, sieht es so aus:
Ich gehe gerne beim <span style="color:blue">Italiener um die Ecke</span> essen.
Nun kommt als nächstes der Ausdruck 'beim Italiener'. Da matcht der RegEx natürlich nicht mehr, da die Markierung nach dem Leerzeichen steht. Ich habe versucht, in den Regex die Möglichkeit des Auftauchens einer Markierung einzubauen, mit:
foreach my $word ( @markwords ) {
$word =~ s/ / (?:$mark1|$mark2)?/gsm;
$text =~ s/$word/$mark1$word$mark2/gmsi;
}
Damit dachte ich würde der Ausdruck verändert zu 'beim (?:<span style="color:blue">|</span>)?Italiener', was dann ja matchen müßte. Tut es aber nicht. Ich nehme mal an, ich habe einen Denkfehler gemacht. Kann den jemand sehen?
Besten Gruß
JOhnnY
Hi,
Damit dachte ich würde der Ausdruck verändert zu 'beim (?:<span style="color:blue">|</span>)?Italiener', was dann ja matchen müßte.
Nicht denken. Zur Kontrolle ausgeben.
cu,
Andreas
Hallo Andreas,
Ergebnis:
Ich gehe gerne beim <span style="color:blue">Italiener (?:<span style="color:blue">|</span>)?um (?:<span style="color:blue">|</span>)?die (?:<span style="color:blue">|</span>)?Ecke</span> essen.
Nun steh ich als Tor genauso davor...
Was ich matchen möchte ist:
Mir fällt nicht ein, wie ich dieses Verhalten erzielen kann. Wenn ich den Regex-Ausdruck für das Ignorieren '(?:<span style="color:blue">|</span>)?' direkt in den Suchausdruck $word hineinkopiere, dann kopiert mir der Regex diesen Ausdruck exakt genauso in das Ergebnis. An und für sich gut, wobei ich dieses 'Ignorieren-Ausdruck' als Teil des Regex ausgeführt haben möchte. Geht sowas?
Besten Gruß
JOhnnY