Johnny B.: kniffeliger RegEx

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

  1. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. 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:

      • prüfe den Suchausdruck
      • ignoriere dabei nach jedem im Suchausdruck vorkommenden Leerzeichen den String $mark1 und/oder $mark2

      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