Andreas Hecht: RegExp gesucht

Ich wälze schon seit Stunden diverse Manuale und Webseiten, ohne zu einer Lösung gekommen zu sein, deshalb meine Frage an die RegExperten:

Gesucht ist ein (perl-kompatibler) RegExp, der auf eine Zeichenkette innerhalb eines längeren Strings passt, deren Anfang und Ende bekannt sind, die aber eine bestimmte Zeichenkette (an beliebiger Position) NICHT enthält.

Also etwas in der Art wie /aa[^b]+cc/, nur dass ich eben anstelle des "b" eine Zeichenkette brauche, die nicht vorkommen darf.

TIA,
Andreas

  1. Hallo Andreas,

    vielleicht geht es so

    /Nur(?!.*Koelsch).*gut/

    erkennt
    "Nur Alt schmeckt wirklich gut"
    aber nicht
    "Nur Koelsch schmeckt wirklich gut".

    Gruß

    Eidgenosse

    1. Hallo Eidgenosse,

      /Nur(?!.*Koelsch).*gut/

      erkennt
      "Nur Alt schmeckt wirklich gut"
      aber nicht
      "Nur Koelsch schmeckt wirklich gut".

      Danke, aber so klappts nicht.
      Diese Lösung erkennt nämlich auch die Variante
      "Nur das echte Kölsch schmeckt wirklich gut"
      und das sollte sie eben nicht. Mit lookahead oder lookbehind bin ich
      irgendwie auch nicht zum Ziel gekommen.

      Trotzdem danke,
      Andreas

      1. Hallo Andreas,

        bie mir funktioniert es - vielleicht liegts an der Version. Andernfalls könnte auch das helfen:

        if($string=~/Nur(.*)gut/ and $1 !~ /Koelsch/) {
            print "Koelsch schmeckt wirklich nicht.\n";
            }

        Gruß

        Eidgenosse

        1. Vielleicht hab ich das Problem etwas vage erklärt. Ich mache eine Serienersetzung in einem längeren Text, der etwa folgende Passage enthält (\n für linebreak):

          [..]
          \n

          • Erstens\n
          • Zweitens\n
            \n
            1. Erster Unterpunkt\n
            2. Zweiter Unterpunkt\n
            \n
          • Drittens\n
            \n
            1. Neue Aufzählung\n
            \n
          • Unterpunkt\n
          • Unterpunkt\n
            \n
            2. Zweiter Punkt der neuen Aufzählung\n
            \n
            [..]

          Herauskommen sollen gültige HTML-Listen (<ol> bzw. <ul>) mit einfach geschachtelten Unterlisten. Die Schritte:
          1. Alle "\n\n- ([^\n]+)" werden zu <ul><li>\1</li>
          2. Alle "\n\n[0-9]+ ([^\n]+)" werden zu <ol><li>\1</li>
          3. Alle "\n- ([^\n]+)" werden zu <li>\1</li>
          4. Alle "<ul>(.*)\n\n" werden zu <ul>\1</ul> (das geht gerade noch)
          5. Alle "<ol>(.*)\n\n" sollen zu <ol>\1</ol> werden - und das geht eben nicht mehr, wegen der Schachtelung.

          regards,
          Andreas

          1. Hi,

            Herauskommen sollen gültige HTML-Listen (<ol> bzw. <ul>) mit einfach geschachtelten Unterlisten. Die Schritte:

            wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr weit zu einem "richtigen" Algorithmus. Gehe die Zeilen nach und nach durch, betrachte sie _einzeln_ in Abhängigkeit vom Kontext (sprich: merke Dir relevante Zustände), generiere den für _diese_ Zeile _und_ den Kontext notwendigen Code.

            Ein möglicher Zustand, den Du Dir merken kannst, ist beispielsweise die ermittelte Schachtelungstiefe.

            Cheatah

            --
            X-Will-Answer-Email: No
            1. Cheatah wrote:

              wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr
              weit zu einem "richtigen" Algorithmus.

              Ein RegExp ist die Beschreibung eines Algorithmus. Ich weiss recht genau, was er tun soll, ich hab nur Probleme mit der Syntax.

              regards,
              Andreas

              1. Hi,

                wenn Du schon mit mehreren Schritten arbeitest, ist es nicht mehr
                weit zu einem "richtigen" Algorithmus.
                Ein RegExp ist die Beschreibung eines Algorithmus.

                beachte die Anführungszeichen in meinem vorherigen Satz.

                Ich weiss recht genau, was er tun soll, ich hab nur Probleme mit der Syntax.

                Meine Empfehlung lautet, den Algorithmus _nicht_ auf einer Reihe von Regular Expressions aufzubauen. Wenn Du innerhalb des Algorithmus' RegExp verwendest, ist das nicht falsch; aber diese sind nicht immer das Allheilmittel zum Zweck.

                Cheatah

                --
                X-Will-Answer-Email: No
              2. Hallo Andreas,

                Ein RegExp ist die Beschreibung eines Algorithmus.

                Das kann ich so nicht stehen lassen. Ein RegEx beschreibt
                keinen Algorithmus, ein RegEx beschreibt eine Gramatik bzw.
                eine Syntax (je nach Zusammenhang).

                Gruesse,
                 CK