3d: Reguläre Ausdrücke, wie kann ich dsa verstehen ?

Hallo,
Ich will Reguläre Ausdrücke verwenden, aber die kann ich nicht leicht verstehen.  Und zwar z.b folgendes
<?php
$zeichenkette = '15. April 2003';
$suchmuster = '/(\d+). (\w+) (\d+)/i';
$ersetzung = '${2}1,$3';
echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
April1,2003

Wie ich verstanden habe:
Suchmuster besteht aus drei Teilen
(\d+) :  also 15
(\w+) : April 200
(\d+) : 3
dann Bei der Ersetzung
${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern
und dann 1,
und dann $3  bedeutet letzte Referenzierung d.h (\d+) =  3
zusammen kommt für mich  031,3
bestimmte irre ich mich, könnte bitte jemand mir das erklären.
 Grüße

  1. Wie ich verstanden habe:
    Suchmuster besteht aus drei Teilen
    (\d+) :  also 15
    (\w+) : April 200
    (\d+) : 3
    dann Bei der Ersetzung
    ${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern
    und dann 1,
    und dann $3  bedeutet letzte Referenzierung d.h (\d+) =  3
    zusammen kommt für mich  031,3
    bestimmte irre ich mich, könnte bitte jemand mir das erklären.
    Grüße

    Hallo!

    Die sind auch nicht leicht zu verstehen. Da hilft nur viel Übung - und gute Notizen, wenn Du lange nichts mit machst, vergißt Du sonst die Hälfte wieder.

    Ich will´s mal versuchen zu erklären.

    $zeichenkette = '15. April 2003';
    $suchmuster = '/(\d+). (\w+) (\d+)/i';

    \d sucht nach Ziffern.
    Ein + bedeutet mindestens einmal, aber beliebig oft soll das Gesuchte vorkommen. Das trifft hier auf 15 zu. Die Klammern um \d+ sorgen dafür, daß das Gefundene intern durchnumeriert wird, angefangen bei 1.

    Als nächstes wird . gesucht. Ein . steht für ein beliebiges Zeichen. Wenn man tatsächlich einen Punkt suchen will, muß man das maskieren, was durch den \ geschieht.

    Jetzt haben wir
    (\d+).
    womit wir
    15.
    finden.

    Anschließend wird ein Leerzeichen gesucht.

    \w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich), wieder beliebig viele, aber mindestens eins. Da der Ausdruck geklammert ist, kriegt der Fund intern die 2.

    Der Rest läuft dann genauso.

    i ist noch ein Modifizierer, der dafür sorgt, daß Groß- und Kleinschreibung nicht berücksicht wird. Das ist hier eigentlich überflüssig.

    Das ist eigentlich ein harmloser Ausdruck, aber man muß das üben.

    1. \w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich), wieder beliebig viele, aber mindestens eins. Da der Ausdruck geklammert ist, kriegt der Fund intern die 2.

      Der Rest läuft dann genauso.

      i ist noch ein Modifizierer, der dafür sorgt, daß Groß- und Kleinschreibung nicht berücksicht wird. Das ist hier eigentlich überflüssig.

      Das ist eigentlich ein harmloser Ausdruck, aber man muß das üben.

      Hallo,
      Ich habe jetzt verstanden, was Du erklärt hast.
      . habe ich erst als beliebig betrachtet , und nicht als Punkt.
      ok nun  jetzt wie geht es weiter ؟

      \w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich).

      ist w+ jetzt April 200(weil es noch ein d+ =3 ), April 2003,  oder April 20 ....

      und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .
      Gruß

      1. Hello,

        Ich habe jetzt verstanden, was Du erklärt hast.
        . habe ich erst als beliebig betrachtet , und nicht als Punkt.
        ok nun  jetzt wie geht es weiter ؟

        \w sucht alpha-numerische Zeichen (Buchstaben, Ziffern und Unterstrich).
        ist w+ jetzt April 200(weil es noch ein d+ =3 ), April 2003,  oder April 20 ....

        http://www.php.net/manual/de/regexp.reference.php

        \w+  ist ein Wortzeichen, also alle Zeichen, die zu Worten gehören. Das Leerzeichen hinter April gehört schon nicht nehr dazu, weil Leerzeichen Worte brechen.

        und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .

        Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll, die aber  sich nicht von '$21' unterscheiden würde. Die '1,' sind dann nur ganz normale Zeichen. Sie sind nicht in der Liste der Sonderbedeutungen enthalten. '$3' ist dann wieder ganz klar als Referenz erkennbar.

        Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Lieber Tom,

          Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)

          LOL - Das ist wohl wahr!

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        2. \w+  ist ein Wortzeichen, also alle Zeichen, die zu Worten gehören. Das Leerzeichen hinter April gehört schon nicht nehr dazu, weil Leerzeichen Worte brechen.

          und bei der Ersetzung steht ${2}. Ist sie eigentlich die letzte Zweie Ziffer 0 und 3 .

          Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll, die aber  sich nicht von '$21' unterscheiden würde. Die '1,' sind dann nur ganz normale Zeichen. Sie sind nicht in der Liste der Sonderbedeutungen enthalten. '$3' ist dann wieder ganz klar als Referenz erkennbar.

          Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)
          Liebe Grüße aus Syburg bei Dortmund

          <?php
          $zeichenkette = '15. April 2003';
          $suchmuster = '/(\d+). (\w+) (\d+)/i';
          $ersetzung = '${2}1,$3';
          echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
          ?>

          Also zusammenfassung :
          (\d+) = 15    : Referenz 1
          . = .        : keine Referenz, weil keine runde Klammer gibt
          (\w+) = April : Referenz 2
          (\d+) = 2003  : Referenz 3

          $ersetzung = April1,2003
          Wunderbar :). Vielen Dank für die Info,

          Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll.

          Das war hier verwirrend. weil die Geschweifte bedeuten für mich eine Anzahl von einem vorkommenden Zeichen oder Buchstabe. und nicht als ein Referenz. Danke für die Erklärung.

          Aber Du kannst Dir über eines sicher sein: der arme Prozessor hat genauso zu schuften, diese Kryptologie wieder zu entschlüsseln, wie Du Mühe hast, sie zu erstellen :-)

          hier hast Du vollkommen recht :)
          Grüße aus Frankfurt

          1. Hello,

            Bei der Ersetzung steht deshalb '${2}1, weil es eigentlich '$2' für die Referenz heißen soll.

            Das war hier verwirrend. weil die Geschweifte bedeuten für mich eine Anzahl von einem vorkommenden Zeichen oder Buchstabe. und nicht als ein Referenz. Danke für die Erklärung.

            Das ist auch verwirrend. Wenn da nun '${3}' stehen würde im Pattern, dann wüsste ich auch nicht, ob nun das Dollarzeichen dreimal als Zeichen vorkommen muss. Kann es im Moment auch nicht ausprobieren.
            Logisch wäre es allerdings, da hier ja nicht das $-Steuerzeichen, sondern das $-Schriftzeichen gemeint ist.

            Es gibt aber noch die alternative Schreibweise \1 anstelle von $1

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Es gibt aber noch die alternative Schreibweise \1 anstelle von $1

              huch.
              In Perl ist \1 aber etwas anderes als S1.

              m/(hallo).*?\1/
              findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.

              m/(\w+?)\1/

              matcht bubu nana hihi blabla

              mfg Beat

              --
              Woran ich arbeite:
              X-Torah
                 <°)))o><                      ><o(((°>o
              1. Hello,

                Es gibt aber noch die alternative Schreibweise \1 anstelle von $1

                huch.
                In Perl ist \1 aber etwas anderes als S1.

                m/(hallo).*?\1/
                findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.

                m/(\w+?)\1/

                matcht bubu nana hihi blabla

                Da das Postinmg auf "PHP" steht, habe ich mich auch daran gehalten :-)
                http://www.php.net/manual/de/regexp.reference.php
                dort ab Abschnitt "\ddd" kurz beschrieben.

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Es gibt aber noch die alternative Schreibweise \1 anstelle von $1

                  huch.
                  In Perl ist \1 aber etwas anderes als S1.

                  m/(hallo).*?\1/
                  findet hallo unter der Voraussetzung, dass es später nochmals vorkommt.

                  m/(\w+?)\1/

                  matcht bubu nana hihi blabla

                  Da das Postinmg auf "PHP" steht, habe ich mich auch daran gehalten :-)
                  http://www.php.net/manual/de/regexp.reference.php
                  dort ab Abschnitt "\ddd" kurz beschrieben.

                  Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.

                  Ich sehe in der Problemstellung des OP nicht, wo diese Backreferenzen sinnvoll eingesetzt werden können.

                  Wiederum ist der Einsatz von $1 zu beachten.
                  $1 findet Anwendung im Ersetzungsteil, nicht im Suchteil.
                  Eine Backreferenz aber wird im Suchteil verwendet. Denn die Backreferenz bezieht sich auf Klammern, nicht auf die Variable $1 welche diese Klammer darstellt.

                  mfg Beat

                  --
                  Woran ich arbeite:
                  X-Torah
                     <°)))o><                      ><o(((°>o
                  1. Hello,

                    Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.

                    Verstehe ich jetzt nicht, wie Du das meinst.
                    siehe: http://www.php.net/manual/de/function.preg-replace.php

                    Ersatz  darf Referenzen in der Form \n oder (ab PHP 4.0.4) $n enthalten,
                         wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text
                         ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann
                         einen Wert von 0 bis 99 haben. \0 oder $0  beziehen sich auf den Text,
                         der auf das komplette Suchmuster passt. Um die Nummer des erfassenden
                         Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend
                         von links nach rechts gezählt.

                    Liebe Grüße aus Syburg bei Dortmund

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Nur ist \1 auch in PHP keine Alternative zu $1, sondern \1 steht unter der Voraussetzung als Backreferenz zur Verfügung, dass eine capturing Klammer vorher verwendet wurde.

                      Verstehe ich jetzt nicht, wie Du das meinst.
                      siehe: http://www.php.net/manual/de/function.preg-replace.php

                      Ersatz  darf Referenzen in der Form \n oder (ab PHP 4.0.4) $n enthalten,
                           wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text
                           ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann
                           einen Wert von 0 bis 99 haben. \0 oder $0  beziehen sich auf den Text,
                           der auf das komplette Suchmuster passt. Um die Nummer des erfassenden
                           Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend
                           von links nach rechts gezählt.

                      OK. das war im anderen referenzierten Teil nicht zu lesen.
                      Zusammenfassung.

                      Beispiel: Vermeide Buchstabenverdoppelungen

                      perl:
                      for($var){
                         s/(\w)\1/$1/; # OK
                         s/(\w)\1/\1/; # WRONG
                         s/(\w)$1/$1/; # WRONG
                      }

                      PHP
                         preg_replace("/(\w)\1/",'$1', $out); // OK
                         preg_replace("/(\w)\1/",'\1', $out); // OK
                         preg_replace("/(\w)$1/",'$1', $out); // WRONG ???

                      mfg Beat

                      --
                      Woran ich arbeite:
                      X-Torah
                         <°)))o><                      ><o(((°>o
  2. Hallo,
    Ich will Reguläre Ausdrücke verwenden, aber die kann ich nicht leicht verstehen.  Und zwar z.b folgendes
    <?php
    $zeichenkette = '15. April 2003';
    $suchmuster = '/(\d+). (\w+) (\d+)/i';
    $ersetzung = '${2}1,$3';
    echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
    ?>
    Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
    April1,2003

    Wie ich verstanden habe:
    Suchmuster besteht aus drei Teilen
    (\d+) :  also 15
    (\w+) : April 200

    Nein. \w+ matcht nur April, weil Whitespace kein \w Zeichen sondern ein \W Zeichen ist.

    (\d+) : 3

    Nein, 2003

    dann Bei der Ersetzung
    ${2} was bedeutet das? für mich wäre 03 die letzte zwei Ziffern

    ${2} ist $2, Es handelt sich um eine Hilfsangabe.
    angenommen du hast.
    "hier steht ein$valuevon 100"
    Dann weiss der kompiler nicht, ob nun $value oder $valuevon vorliegt
    "hier steht ein${value}von 100"
    macht es klar, dass wir über $value sprechen.

    und dann 1,
    und dann $3  bedeutet letzte Referenzierung d.h (\d+) =  3
    zusammen kommt für mich  031,3
    bestimmte irre ich mich, könnte bitte jemand mir das erklären.

    in folge des obigen Fehlers ja.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o