Jo: Reguläre Ausdrücke

Hallo,

wie kann ich innerhalb eines regulären Ausdruckes ausdrücken, dass ein bestimmtes Wort nicht vorkommen soll?

Zum Beispiel: /<start id="1">XXX</start>/

XXX soll ausdrücken, dass dort kein <start id="2"> vorkommen soll.

Wer weiss Rat?

Jo

  1. Hallo,

    Zum Beispiel: /<start id="1">XXX</start>/

    Der reguläre Ausdruck ist kaputt. Oder er bedeutet, dass <start id="1">XXX< durch start> ersetzt werden soll; ist glaub ich nicht ganz was du willst oder? (ausserdem fehlt in diesem Fall das "s" davor)

    XXX soll ausdrücken, dass dort kein <start id="2"> vorkommen soll.

    Versteh ich absolut nicht was du meinst. Kannst du das näher präzesieren?

    Peter

    1. Versteh ich absolut nicht was du meinst. Kannst du das näher präzesieren?

      Hier ist nochmal ein Beispiel:

      my $str = "<start id="1"> bla bla 1 </start><start id="2">bla bla 2 </start>";
      $str =~ s/<start id="2">.*</start>//g; ### das geht noch so
      ###$str =~ s/<start id="1">.*</start>//g; ### aber das nicht
      print $str."\n";

      Ich will also ein <start>-Element komplett rauswerfen, das andere soll aber drin bleiben.

      1. Ich will also ein <start>-Element komplett rauswerfen, das andere soll aber drin bleiben.

        Evtl. hilft dir das Modul HTML::Parser weiter, da HTML Tags zu filtern, was du ja offensichtlich willst, nicht ganz trivial ist und dieses Modul doch um einieges mächtiger zu sein scheint als ein paar zusammengebastelte RegExp (wobei ich selber wenig Erfahrung damit habe).

        Struppi.

      2. Hey Jo,

        ich glaub, der Fehler liegt im fehlenden Fragezeichen hinter dem *.

        s/<start id="1">.*</start>//g

        ersetzt Dir den ganzen Text von Anfang bis Ende

        s/<start id="1">.*?</start>//g

        ist "non-greedy", d.h. es wird nur der Teil bis zum nächsten Vorkommen von "</start>" ersetzt.

        War's das?

        Christoph

        Versteh ich absolut nicht was du meinst. Kannst du das näher präzesieren?

        Hier ist nochmal ein Beispiel:

        my $str = "<start id="1"> bla bla 1 </start><start id="2">bla bla 2 </start>";
        $str =~ s/<start id="2">.*</start>//g; ### das geht noch so
        ###$str =~ s/<start id="1">.*</start>//g; ### aber das nicht
        print $str."\n";

        Ich will also ein <start>-Element komplett rauswerfen, das andere soll aber drin bleiben.

        1. War's das?

          Hallo Cristoph,

          ja das hilft mir weiter, danke.

          Jo

  2. Hallo Peter,

    so richtig deutlich ist Deine Fragestellung ja nicht,
    aber ich vermute wass Du meinen koenntest. Versuche mal
    den in dem Ausdruck stehenden Schraegstrich zu maskieren.
    Also einfach mit einem vorangestellten Backslash (). Das
    sieht dann so aus:
      /<start id="1">XXX</start>/
    Finde zudem noch in der Dokumentation heraus, bei welchen
    Zeichen es erforderlich ist, sie zu maskieren. Ich hoffe
    ich habe Dir damit geholfen, Gruss vom Bodensee,

    Michael Wronna