Tom Collins: Problem mit RegExp

Hallo Leute,

ich möchte aus einem String alle Sonderzeichen kopieren und habe folgendes Script geschrieben:

<html>
  <head>
    <title>RegExp-Test</title>
  </head>
  <body>
    <script type="text/javascript">
      var myRegExp = /([^a-zA-ZäöüÄÖÜß0-9])/g;
      var trefferListe = myRegExp.exec("Dorf-Ostdorf/Rhur");
      var trefferListeJoin = trefferListe.join(" ");
      alert(trefferListe.length + ' Elemente in ' + trefferListeJoin);
    </script>
  </body>
</html>

Nach meinem Verständnis müsste trefferListeJoin so aussehen:
"- /"
Sieht aber so aus:
"- -"

Kann mir jemand sagen, wo mein Denkfehler liegt?

Vielen Dank und Grüße von Tom

  1. gruss Tom

    Hallo Leute,

    ich möchte aus einem String alle Sonderzeichen kopieren und habe folgendes Script geschrieben:
    ...
    var myRegExp = /([^a-zA-ZäöüÄÖÜß0-9])/g;
    var trefferListe = myRegExp.exec("Dorf-Ostdorf/Rhur");
    var trefferListeJoin = trefferListe.join(" ");
    alert(trefferListe.length + ' Elemente in ' + trefferListeJoin);
    ...
    Nach meinem Verständnis müsste trefferListeJoin so aussehen:
    "- /"
    Sieht aber so aus:
    "- -"

    Kann mir jemand sagen, wo mein Denkfehler liegt?

    Du benutzt die methode "RegExp.exec", welche ein suchmuster genau
       einmal ausfuehrt; Dein pattern sucht global nach genau einem zeichen,
       welches nicht den in der eckigen klammer angegebenen zeichen
       entspricht - durch verwendung der runden klammern speicherst
       Du das suchergebnis in "RegExp.$1", obwohl Du darauf nach
       "exec" gar nicht zugreifst;

    das Du jetzt zweimal "-" liegt wahrscheinlich daran, dass Dir
       das pattern voellig korrekt das eine gewuenschte zeichen aus
       "[^a-zA-ZäöüÄÖÜß0-9]" zusammen mit noch einmal demselben zeichen
       aus RegExp.$1 zurueckgibt, was der verwendung der runden klammern
       geschuldet sein wird;

    fuer Dein beispiel fuehrt die methode "exec" nur ueber umwege
       zum gewuenschten ziel, einfacher ist die verwendung der String-
       methode "match" zusammen mit einer kleinen korrektur an Deinem
       regulaeren ausdruck:

    var myRegExp = /[^a-zA-ZäöüÄÖÜß0-9]+/g;
       // sucht folgen von sonderzeichen, die aus mindesten einem
       // zeichen bestehen "[...]+" und das ganze dann globel "g";
       var trefferListe = ("Dorf-Ostdorf/Rhur").match(myRegExp);
       // wendet den RegExp auf ein string-objekt an;
       // jede einzelne sonderzeichen-folge wird als eintrag in
       // einem array gespeichert, welches diese methode zurueckgibt;
       var trefferListeJoin;
       if (trefferListe) {
         trefferListeJoin = trefferListe.join(" ");
         alert(trefferListe.length + ' Elemente in ' + trefferListeJoin);
       } else {
         alert("keine treffer");
       }

    jetzt erhaelst Du als ergebnis auch das gewuenschte "- /";

    by(t)e by(t)e - peterS. - pseliger@gmx.net

    --
    sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
    1. Hallo Joachim und peterS,

      vielen Dank für das Kopfgeraderücken, jetzt habe ich den Fehler begriffen.

      Viele Grüße von Tom C.

      1. Falls es Euch interessiert:

        Hier die fertige Funktion (ich weiß, kein Javascript für Basis-Funktionalität, man könnte den Quelltext auch noch deutlich kürzen - aber es war eine schöne Übung für eine Seite ohne Serverscripte). Aufgabe war es, aus schrägen Formulareingaben etwas zu machen, was ein _Mensch_ auf den ersten Blick versteht und was ohne großen Aufwand aus einer E-Mail in eine Exceltabelle kopiert werden kann:

        hANS-herrmann -> Hans-Herrmann
        MEIER-mÜLLER -> Meier-Müller
        mosel-saar-ruwer-bürger-steig 12 ->Mosel-Saar-Ruwer-Bürger-Steig 12
        ort-OSTORT/wÜmMe -> Ort-Ostort/Wümme

        // string CaseCorrect(string stringToCorrect)
        function CaseCorrect(sendedTerm){
           var myTerm = '';
           var mySplitTerms = sendedTerm.split(/[^a-zA-ZäöüÄÖÜß0-9]/);
           var i = 0;
           var myFirst = '';
           var myRest = '';

        var myRegExp = /[^a-zA-ZäöüÄÖÜß0-9]+/g;
           var trefferListe = sendedTerm.match(myRegExp);

        for (i = 0; i < mySplitTerms.length; i++) {
             myFirst = mySplitTerms[i].substr(0,1);
             myRest = mySplitTerms[i].substr(1,mySplitTerms[i].length-1);
             myFirst = myFirst.toUpperCase();
             myRest = myRest.toLowerCase();
             myTerm = myTerm + myFirst + myRest;
             if (trefferListe) {
               if (i < trefferListe.length) {myTerm += trefferListe[i];}
             }
           }
           return myTerm;
        }

        Grüße von Tom C.

  2. Hi,

    var myRegExp = /([^a-zA-ZäöüÄÖÜß0-9])/g;
          var trefferListe = myRegExp.exec("Dorf-Ostdorf/Rhur");

    der Ausdruck passt hier als erstes auf "-". In trefferListe[0]  steckt der match, in trefferListe[1] der Inhalt der ersten Klammer - beide Male also "-".

    Gruesse  Joachim