steffen: Regex: Nur bestimmte Zeichen ausgeben

Hallo Nachteulen,

ich habe eine eingabe "Das ist ein test" und diese würde ich gerne alle Zeichen die ich nicht möchte weg machen.

Ich habe jetzt folgendes Probiert:

  
var text = "Das ist ein test";  
var search = /([\w\d-_\.]+)/g;

jedoch bekomme ich bei search.length immer 2 heraus, obwohl g ja dafür steht, dass er den ganzen String durchsuchen soll.

Liege ich da falsch oder steh ich einfach nur auf dem Schlauch?

LG Steffen

  1. gudn tach!

    ich habe eine eingabe "Das ist ein test" und diese würde ich gerne alle Zeichen die ich nicht möchte weg machen.

    Ich habe jetzt folgendes Probiert:

    var text = "Das ist ein test";
    var search = /([\w\d-_.]+)/g;

    
    >   
    > jedoch bekomme ich bei search.length immer 2 heraus  
      
    nach aufruf welcher funktion? und welche zahl erwartest du, warum?  
      
    
    > Liege ich da falsch oder steh ich einfach nur auf dem Schlauch?  
      
    sehr wahrscheinlich.  
      
      alert("Das ist ein test".replace(/([\w\d-\_\.]+)/g, "").length)  
    gibt bei mir 3 raus, weil die leerzeichen uebrigbleiben. beachte aber, dass "\w" schon die ziffern "\d" enthaelt, aber meist keine umlaute. den punkt brauchst du in zeichenklassendefinitionen (also z.b. [ab.]) nicht zu maskieren.  
      
    prost  
    seth
    
  2. ich habe eine eingabe "Das ist ein test" und diese würde ich gerne alle Zeichen die ich nicht möchte weg machen.

    Ich habe jetzt folgendes Probiert:

    var text = "Das ist ein test";
    var search = /([\w\d-_.]+)/g;

    
    >   
    > jedoch bekomme ich bei search.length immer 2 heraus  
      
    Kann nicht sein, search ist ein RegEx-Objekt, das hat kein Attribut length.  
      
    Hast du vielleicht eher etwas in der Richtung m = search.exec(text) ausprobiert und für m.length den Wert 2 bekommen?  
    search.exec() liefert ein Feld, in dem an Position 0 der Textbereich steht, der auf das gesamte Muster passt. Auf den Positionen danach finden sich die geklammerten Teile.  
      
    Du erhältst also in deinem Falle m.length == 2 und genau zwei Einträge: m[0] ist "Das" und, da du das gesamte Muster geklammert hast, folgt m[1] mit nochmals "Das".  
    Nimmst du die runden Klammern aus deinem Muster raus, erhältst du ein Feld m mit nur einem Eintrag, m.length ist dementsprechend 1.  
      
    
    > obwohl g ja dafür steht, dass er den ganzen String durchsuchen soll.  
      
    Rufe search.exec() nochmals auf, dann bekommst du den nächsten Treffer, in deinem Falle m.length == 1, m[0] == "ist", m[1] == "ist". Der dritte und vierte Aufruf von search.exec() ergibt dann "ein" und "test", und beim fünften Aufruf erhältst du false zurück.  
      
      
    Da du aber etwas ersetzen möchtest und nicht suchen, bis du bei search.exec() eh ziemlich verkehrt. text.replace(search, "") macht, was du möchtest (die runden Klammern sind auch hier überflüssig).  
      
      
    Davon unabhängig: Willst du mit deinem Muster [\w\d-\_\.] \_alle\_ Zeichen von \d bis \_, oder meinst du eher \d, -, \_? Dann setze den Bindestrich ans Ende der Klasse, vor die schließende eckige Klammer. Der Bindestrich hat eine besondere Bedeutung, [a-z] heisst "a bis z", trifft also quasi das ganze Alphabet, nicht die drei Zeichen "a", "-", "z".  
    
    
    1. gudn tach!

      Davon unabhängig: Willst du mit deinem Muster [\w\d-_.] _alle_ Zeichen von \d bis _

      da wuerde keinen sinn machen und deshalb interpretiert eine anstaendige regexp-engine das "-" hier auch literal, siehe <http://perldoc.perl.org/perlre.html#Version-8-Regular-Expressions@perldoc perlre>.

      , oder meinst du eher \d, -, _?

      falls das gemeint ist, war die notation richtig. und bzgl. des "-" ist keine aenderung noetig.

      prost
      seth

      1. Hi,

        gudn tach!

        Davon unabhängig: Willst du mit deinem Muster [\w\d-_.] _alle_ Zeichen von \d bis _

        da wuerde keinen sinn machen und deshalb interpretiert eine anstaendige regexp-engine das "-" hier auch literal, siehe <http://perldoc.perl.org/perlre.html#Version-8-Regular-Expressions@perldoc perlre>.

        , oder meinst du eher \d, -, _?

        falls das gemeint ist, war die notation richtig. und bzgl. des "-" ist keine aenderung noetig.

        Ich würd's trotzdem immer ans Ende stellen.
        Irgendwann will man noch ein zusätzliches Zeichen mit erwischen (z.B. @), und schreibt's nach den "Zeichengruppen" \w\d rein ==> [\w\d@-_.]
        Und plötzlich ist das Verhalten nicht mehr das gewünschte ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. gudn tach!

          Ich würd's trotzdem immer ans Ende stellen.
          Irgendwann will man noch ein zusätzliches Zeichen mit erwischen (z.B. @), und schreibt's nach den "Zeichengruppen" \w\d rein ==> [\w\d@-_.]
          Und plötzlich ist das Verhalten nicht mehr das gewünschte ...

          haeufig werden zusaetzliche zeichen ja gerade am anfang oder am ende eingefuegt...

          fazit: man muss _immer_ aufpassen, wenn man etwas an einer char class aendert.

          prost
          seth

          1. Ich würd's trotzdem immer ans Ende stellen.
            Irgendwann will man noch ein zusätzliches Zeichen mit erwischen (z.B. @), und schreibt's nach den "Zeichengruppen" \w\d rein ==> [\w\d@-_.]
            Und plötzlich ist das Verhalten nicht mehr das gewünschte ...

            haeufig werden zusaetzliche zeichen ja gerade am anfang oder am ende eingefuegt...

            Da hast du recht, das ist sicher das Einfachste, wenn man keinen Wert auf übersichtlichen Code legt. Genauso häufig werden andere Leute aber die Zeichen halbwegs sortiert auflisten.

            fazit: man muss _immer_ aufpassen, wenn man etwas an einer char class aendert.

            Das ist keine Begründung für schludrige Arbeit im Vorfeld. Deine Erfahrung, "_immer_" aufpassen zu müssen, ist schon eher die Folge davon.

            1. gudn tach!

              Ich würd's trotzdem immer ans Ende stellen.
              Irgendwann will man noch ein zusätzliches Zeichen mit erwischen (z.B. @), und schreibt's nach den "Zeichengruppen" \w\d rein ==> [\w\d@-_.]
              Und plötzlich ist das Verhalten nicht mehr das gewünschte ...

              haeufig werden zusaetzliche zeichen ja gerade am anfang oder am ende eingefuegt...

              Da hast du recht, das ist sicher das Einfachste, wenn man keinen Wert auf übersichtlichen Code legt. Genauso häufig werden andere Leute aber die Zeichen halbwegs sortiert auflisten.

              und dann z.b. aus [...a-z...] ein [...a@-z...] basteln? sortieren kann man auf viele weisen. chronologisch ist auch eine moeglichkeit.

              fazit: man muss _immer_ aufpassen, wenn man etwas an einer char class aendert.

              Das ist keine Begründung für schludrige Arbeit im Vorfeld. Deine Erfahrung, "_immer_" aufpassen zu müssen, ist schon eher die Folge davon.

              nein, nicht alles, was nicht den eigenen vorstellungen von ordnung entspricht, ist "schludrig", sondern konventionen und sinn fuer ordnung und aesthetik sind nun mal nicht immer in allen koepfen gleich. das faengt schon bei der code-einrueckung an, bei der es immer wieder grabenkaempfe gibt. und selbst innerhalb eines kopfes koennen sich da ansichten im laufe der zeit aendern. deshalb muss man - besonders bei so komprimierten dingen wie regulaeren ausdruecken - _immer_ aufpassen, sogar wenn man der einzige ist, der bisher die haende am code hatte.

              iow: ich sehe es vielmehr als schludrig an, bei aenderungen an regexps _nicht_ aufzupassen. ;-)

              prost
              seth

    2. Hallo steffi,

      tut mir leid das ich natürlich die function sowie das Ergebnis vergessen hatte das ich raus haben wollte.

      Also was ich haben will ist:

      var text = "Das ist ein Test";
      Rauskommen soll: "DasisteinTest".

      Soll eigentlich zum erstellen von exchange emails genutzt werden.

      Aber ich kann auch einfach ein replace drauf machen und alle leerzeichen ersetzen. Aber danke für die info mit exec :)

      Liebe Grüße und ein schönes WE
      Steffen

      ich habe eine eingabe "Das ist ein test" und diese würde ich gerne alle Zeichen die ich nicht möchte weg machen.

      Ich habe jetzt folgendes Probiert:

      var text = "Das ist ein test";
      var search = /([\w\d-_.]+)/g;

      
      > >   
      > > jedoch bekomme ich bei search.length immer 2 heraus  
      >   
      > Kann nicht sein, search ist ein RegEx-Objekt, das hat kein Attribut length.  
      >   
      > Hast du vielleicht eher etwas in der Richtung m = search.exec(text) ausprobiert und für m.length den Wert 2 bekommen?  
      > search.exec() liefert ein Feld, in dem an Position 0 der Textbereich steht, der auf das gesamte Muster passt. Auf den Positionen danach finden sich die geklammerten Teile.  
      >   
      > Du erhältst also in deinem Falle m.length == 2 und genau zwei Einträge: m[0] ist "Das" und, da du das gesamte Muster geklammert hast, folgt m[1] mit nochmals "Das".  
      > Nimmst du die runden Klammern aus deinem Muster raus, erhältst du ein Feld m mit nur einem Eintrag, m.length ist dementsprechend 1.  
      >   
      > > obwohl g ja dafür steht, dass er den ganzen String durchsuchen soll.  
      >   
      > Rufe search.exec() nochmals auf, dann bekommst du den nächsten Treffer, in deinem Falle m.length == 1, m[0] == "ist", m[1] == "ist". Der dritte und vierte Aufruf von search.exec() ergibt dann "ein" und "test", und beim fünften Aufruf erhältst du false zurück.  
      >   
      >   
      > Da du aber etwas ersetzen möchtest und nicht suchen, bis du bei search.exec() eh ziemlich verkehrt. text.replace(search, "") macht, was du möchtest (die runden Klammern sind auch hier überflüssig).  
      >   
      >   
      > Davon unabhängig: Willst du mit deinem Muster [\w\d-\_\.] \_alle\_ Zeichen von \d bis \_, oder meinst du eher \d, -, \_? Dann setze den Bindestrich ans Ende der Klasse, vor die schließende eckige Klammer. Der Bindestrich hat eine besondere Bedeutung, [a-z] heisst "a bis z", trifft also quasi das ganze Alphabet, nicht die drei Zeichen "a", "-", "z".  
      > 
      
      1. @@steffen:

        nuqneH

        Also was ich haben will ist:

        var text = "Das ist ein Test";
        Rauskommen soll: "DasisteinTest".

        Du willst also alle Leerzeichen durch nichts ersetzen.

        Qapla'

        --
        Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)