Anzeige:
Ergebnis 1 bis 9 von 9

Thema: perl frage zu regexp

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.05.2002
    Beiträge
    43

    Question perl frage zu regexp

    Hi,

    ich habe folgendes Problem und weiß nicht wie man es lösen kann.

    Ein String mit haufenweise Text enthält an irgendeiner Stelle quasi markierten Text, ähnlich wie hier im Forum beim quote oder code.


    Code:
    TEXT TEXT ETXT ETES fjsefeasffs fskj fhsf
    sfklsjl kjsf lsfj sl fjlsfj <--change-->blab bla blunnb blub </--change-->js sf
    sfjke jlsf
    s fks ls
    Ich möchte alles von <--change--> bis </--change--> aus dem String entfernen.

    mit

    [CODE]
    $text =~ s/<--change-->//sig;
    [CODE]

    würde ich ja nur das change geraffel löschen, kann ich die regexp so bauen, dass sie den Inhalt dazwischen löscht? Oder ist regexp dafür nicht geeignet?

    Gruß
    otelo

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Probier mal s#<--change-->.*</--change-->##sig Kann allerdings sein, dass du da Probleme mit der "Gier" bekommst. Dann könnte s#<--change-->[^<]*</--change-->##sig helfen sofern zwischen den beiden Markern kein Kleiner-Als vorkommt...
    chmod -R +t /*

  3. #3
    Registrierter Benutzer
    Registriert seit
    22.05.2002
    Beiträge
    43
    geil :-)

    danke!

    damit gehts

    Code:
     $text =~ s#<\-\-change\-\->.*<\/\-\-change\-\->##sig;
    Und damit habe ich wieder etwas mehr regexp verstanden

    Gruß
    otelo

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.04.2005
    Beiträge
    105
    HTML-Code:
    $text =~ s#<\-\-change\-\->.*?<\/\-\-change\-\->##sig;
    wäre hier schneller weil er sonst alle zeichen für .* einsetzt und dann kürzt

    ausserdem würde das so nur für einen TAG funktionieren und nicht für mehrere

    EDIT:
    HTML-Code:
    $text =~ s#<\-\-change\-\->|<\/\-\-change\-\->##sig;
    ein oder wär doch noch besser :-D
    Geändert von baumgartner (14-12-2005 um 15:10 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Zitat Zitat von baumgartner
    HTML-Code:
    $text =~ s#<\-\-change\-\->.*?<\/\-\-change\-\->##sig;
    wäre hier schneller weil er sonst alle zeichen für .* einsetzt und dann kürzt

    ausserdem würde das so nur für einen TAG funktionieren und nicht für mehrere
    Stimmt wohl. Aber '-' ist meines Wissens und auch meinen Nachschlagewerken nach kein Sonderzeichen, muss also nicht escaped werden, oder was ist mir da entgangen?
    Zitat Zitat von baumgartner
    EDIT:
    HTML-Code:
    $text =~ s#<\-\-change\-\->|<\/\-\-change\-\->##sig;
    ein oder wär doch noch besser :-D
    Entfernt dann aber nur die Marker, ich denke der OP wollte dass auch der Text dazwischen schwindet...
    chmod -R +t /*

  6. #6
    Registrierter Benutzer
    Registriert seit
    15.04.2005
    Beiträge
    105
    zu 1) hast du recht, darauf hab ich aber gar net geschaut
    lol

    zu 2) stimmt hab ich überlesen, dann doch ersteres

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.05.2002
    Beiträge
    43
    *grins

    habt recht, ich hatte bei Tests anfänglich Probleme mit dem minus (zumindest sah es so aus) und als ich minus ausquotiert hatte gings auf einmal, aber nach euren Beiträgen hab ich es umgestellt und nun funktioniert es auch so.

    Was bedeutet das .*? in Worten? Bedeutet das in allen Fällen Wiederholung?

    Gruß
    otelo

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Zitat Zitat von otelo
    Was bedeutet das .*? in Worten? Bedeutet das in allen Fällen Wiederholung?
    Zitat Zitat von "Johan Vromans" Perl 5 kurz & gut; O'Reilly; 2000; S. 44
    Quantifizierte Submuster werden so oft wie möglich erkannt. Folgt den Mustern ein ?, wird die minimale Anzahl erkannt. Die folgenden Mengenmodifikatoren (>>Quantifier<<) stehen zu Verfügung:

    + Erkennt das vorstehende Musterelement ein oder mehrmals.

    ? Erkennt ein Element nicht oder einmal.

    * Erkennt das Element nicht oder mehrmals.
    Beispiel:
    Code:
    $text = "Hallo <mark>Erde</mark>Welt<mark>.</mark>!";
    $text =~ s#<mark>.*</mark>##sig;
    print($text . "\n");
    Ausgabe:
    Hallo !

    Code:
    $text = "Hallo <mark>Erde</mark>Welt<mark>.</mark>!";
    $text =~ s#<mark>.*?</mark>##sig;
    print($text . "\n");
    Ausgabe:
    Hallo Welt!

    Ersteres frisst also alles zwischen dem ersten <mark> und dem letzten </mark>. Das meint ich mit der "Gier". Auf das ? bin ich dabei allerdings nicht gekommen, aber das hat baumgartner ja folgerichtig eingeworfen. Also letzteres ist das was du suchst.
    chmod -R +t /*

  9. #9
    Registrierter Benutzer
    Registriert seit
    15.04.2005
    Beiträge
    105
    bei .* ist die regex-engine gierig und versucht alles zu verschlingen

    bei .*? versucht sie allerdings so wenig wie möglich dazwischen zu erkennen

    @sticky bit, das bsp. ist gut :-D

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •