Paul: String splitten anhand mehrerer Trennzeichen

Hi!

Kennt jemand von euch eine Funktion, mit der einen String anhand mehrerer Trennzeichen splitten kann und als Ergebnis einen Array zurückgibt? Die Methode String.split() kann ja leider nur ein Suchmuster verwerten.

Danke, Paul

  1. Hallo,

    Kennt jemand von euch eine Funktion, mit der einen String anhand mehrerer Trennzeichen splitten kann und als Ergebnis einen Array zurückgibt? Die Methode String.split() kann ja leider nur ein Suchmuster verwerten.

    splitte der Reihe nach auf und verkette die Ergebnisarrays.

    Freundliche Grüße

    Vinzenz

  2. Hi,

    Kennt jemand von euch eine Funktion, mit der einen String anhand mehrerer Trennzeichen splitten kann und als Ergebnis einen Array zurückgibt? Die Methode String.split() kann ja leider nur ein Suchmuster verwerten.

    "Ja-ein+Suchmuster-reicht+doch-auch.".split(/\+|-/);   // oder  
    "Wirklich+glaub-mir+tut-es!".split(/[+-]/);
    

    Du musst nur "Suchmuster" auch wirklich im Sinne eines *Musters*, eines Patterns - eines Regular Expression Patterns - verstehen.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi!

      Danke für alle Antworten! Darauf, dass ich da einen Regulären Ausdruck einbauen kann bin ich gar nicht gekommen.

      Paul

      1. Hi!

        Danke für alle Antworten! Darauf, dass ich da einen Regulären Ausdruck einbauen kann bin ich gar nicht gekommen.

        Ich hab den String jetzt mit dem Regulären Ausdruck gesplittet, aber leider wird das Trennzeichen dann ja aus dem Text entfernt. Hab ich eine Möglichkeit, dies zu ändern?

        Danke, paul

        1. Hi,

          Ich hab den String jetzt mit dem Regulären Ausdruck gesplittet, aber leider wird das Trennzeichen dann ja aus dem Text entfernt. Hab ich eine Möglichkeit, dies zu ändern?

          Wenn du die Möglichkeit hast, auf den IE zu verzichten, dann ja - es geht bei split ganz genau so, wie das Capturing bei regulären Ausdrücken immer geht. Nur der IE ist immer noch zu blöd dazu. Für den muss man sich dann Workarounds basteln (bzw. ergooglen), die das ganze etwas umständlicher lösen, in dem sie entweder einen regulären Ausdruck anwenden, der sowohl die gesuchten Trennzeichen als auch den "Rest" matched, oder das ganze mit "normalen" String-Methoden, und sich das dann selber in ein Array einfügen.

          MfG ChrisB

          --
          Light travels faster than sound - that's why most people appear bright until you hear them speak.
          1. Hi,

            Wenn du die Möglichkeit hast, auf den IE zu verzichten, dann ja - es geht bei split ganz genau so, wie das Capturing bei regulären Ausdrücken immer geht. Nur der IE ist immer noch zu blöd dazu. Für den muss man sich dann Workarounds basteln (bzw. ergooglen), die das ganze etwas umständlicher lösen, in dem sie entweder einen regulären Ausdruck anwenden, der sowohl die gesuchten Trennzeichen als auch den "Rest" matched, oder das ganze mit "normalen" String-Methoden, und sich das dann selber in ein Array einfügen.

            Leider werde ich daraus nicht ganz schlau. Wie heißt denn die Methode oder Funktion dazu?

            MfG Paul

          2. gruss ChrisB, hallo Paul,

            Ich hab den String jetzt mit dem Regulären Ausdruck gesplittet,
            aber leider wird das Trennzeichen dann ja aus dem Text entfernt.
            Hab ich eine Möglichkeit, dies zu ändern?

            Wenn du die Möglichkeit hast, auf den IE zu verzichten, dann ja -
            es geht bei split ganz genau so, wie das Capturing bei regulären
            Ausdrücken immer geht. ...

            @ChrisB - ich bin bis heut' im traum nicht auf den gedanken gekommen,
            funktionierendes capture verhalten von RegX-en bei [split] auch nur
            zu unterstellen - nie versucht - gleich ausprobiert - *funzt* in
            firefox und chrome - aber ...

            ... Nur der IE ist immer noch zu blöd dazu.
            Für den muss man sich dann Workarounds basteln (bzw. ergooglen),
            die das ganze etwas umständlicher lösen, ...

            wollt' ich auch gleich mal selber haben - hier mein erster wurf
            einer generischen loesung (bei Fragen fragen) mit angeschlossenem
            *quick and dirty* test:

            (function (str) {  
              if (str.split(/([.])/).join("") !== str) {  
              
              
                String.prototype.split = (function (regX) {  
              
              
                  var isNotUndefined = (function (obj/*:[object|value]*/) {  
              
                    return (typeof obj != "undefined");  
                  }),  
                  isRegExp = (function () {  
              
                    var exposeImplementation = Object.prototype.toString, regXBaseClass = (/^\[object\s+RegExp\]$/);  
                    return (function (obj/*:[object|value]*/) {  
              
                      return regXBaseClass.test(exposeImplementation.call(obj));  
                    });  
                  })(),  
              
                  nativeSplit = String.prototype.split,  
              
                  makeArrayByFixedSplit = (function (str, regX) {  
              
                    var arr = [], regXResult = (regX.test(str) && regX.exec(str));  
                    if (isNotUndefined(regXResult[1])) {  
              
                      do {  
                        arr.push(str.substring(0, regXResult.index));  
                        arr.push(regXResult[1]);  
                        str = str.substring(regXResult.index + regXResult[1].length);  
              
                        regXResult = (regX.test(str) && regX.exec(str));  
              
                      } while (isNotUndefined(regXResult[1]));  
              
                      arr.push(str);  
              
                    } else {  
                      arr = nativeSplit.call(str, regX);  
                    }  
                    return arr;  
                  });  
              
                  return (function (splitPattern) {  
              
                    var arr, str = String(this);  
                    if (isRegExp(splitPattern)) {  
              
                      arr = makeArrayByFixedSplit(str, splitPattern);  
                    } else {  
                      arr = nativeSplit.call(str, String(splitPattern));  
                    }  
                    return (arr || [str]);  
                  });  
                })();  
              }  
            })("String.prototype.split");  
              
              
              
            /*  
              quick test - all code needs to be pasted into [http://jconsole.com/] :  
            */  
            print(String.prototype.split);  
            print("\n");  
              
            print(("String.prototype.split").split(/([.])/));  
            print(("String.prototype.split").split(/[.]/));  
            print(("String.prototype.split").split("."));  
            print("\n");  
              
            print(("String.prototype.split").split(/([.])/).join("") === "String.prototype.split"); // true  
            print(("String.prototype.split").split(/[.]/).join("") === "String.prototype.split"); // false  
            print(("String.prototype.split").split(".").join("") === "String.prototype.split"); // false  
            print("\n");  
              
            print("\"" + ("Quisque ut blandit risus. Integer vehicula, arcu et placerat "  
            +"sollicitudin, nunc leo ornare purus, a dapibus dolor lectus "  
            +"id nisi. Sed ligula sem, gravida interdum sodales ac, rutrum "  
            +"nec tortor. Nunc sed tristique turpis. Maecenas diam turpis, "  
            +"pulvinar eget dignissim at, convallis quis erat! Mauris "  
            +"pretium malesuada tortor, vel aliquet eros sodales ut. "  
            +"Vivamus id massa et sem luctus pretium. Duis cursus lacinia "  
            +"feugiat. Sed scelerisque sem vel diam feugiat pharetra. "  
            +"Donec non tortor sit amet sem placerat suscipit. Integer "  
            +"consequat urna sed orci suscipit porttitor nec et eros. Sed "  
            +"ullamcorper dictum lorem nec adipiscing? Aliquam eget mauris "  
            +"eget ipsum pretium accumsan at vel enim.").split(/([.,!?])/).join("\", \"") + "\"");  
            print("\n");  
              
              
            /*  
              quick test results:  
            */  
            print(/*native result as in mozilla firefox*/["Quisque ut blandit risus", ".", " Integer vehicula", ",", " arcu et placerat sollicitudin", ",",  
            " nunc leo ornare purus", ",", " a dapibus dolor lectus id nisi", ".", " Sed ligula sem", ",", " gravida interdum sodales ac", ",",  
            " rutrum nec tortor", ".", " Nunc sed tristique turpis", ".", " Maecenas diam turpis", ",", " pulvinar eget dignissim at", ",",  
            " convallis quis erat", "!", " Mauris pretium malesuada tortor", ",", " vel aliquet eros sodales ut", ".",  
            " Vivamus id massa et sem luctus pretium", ".", " Duis cursus lacinia feugiat", ".", " Sed scelerisque sem vel diam feugiat pharetra",  
            ".", " Donec non tortor sit amet sem placerat suscipit", ".", " Integer consequat urna sed orci suscipit porttitor nec et eros", ".",  
            " Sed ullamcorper dictum lorem nec adipiscing", "?", " Aliquam eget mauris eget ipsum pretium accumsan at vel enim",  
            ".", ""].toString() === /*native result as in google chrome*/["Quisque ut blandit risus", ".", " Integer vehicula", ",",  
            " arcu et placerat sollicitudin", ",", " nunc leo ornare purus", ",", " a dapibus dolor lectus id nisi", ".", " Sed ligula sem", ",",  
            " gravida interdum sodales ac", ",", " rutrum nec tortor", ".", " Nunc sed tristique turpis", ".", " Maecenas diam turpis", ",",  
            " pulvinar eget dignissim at", ",", " convallis quis erat", "!", " Mauris pretium malesuada tortor", ",",  
            " vel aliquet eros sodales ut", ".", " Vivamus id massa et sem luctus pretium", ".", " Duis cursus lacinia feugiat", ".",  
            " Sed scelerisque sem vel diam feugiat pharetra", ".", " Donec non tortor sit amet sem placerat suscipit", ".",  
            " Integer consequat urna sed orci suscipit porttitor nec et eros", ".", " Sed ullamcorper dictum lorem nec adipiscing", "?",  
            " Aliquam eget mauris eget ipsum pretium accumsan at vel enim",  
            ".", ""].toString()); // true  
              
            print(/*native result as in mozilla firefox*/["Quisque ut blandit risus", ".", " Integer vehicula", ",", " arcu et placerat sollicitudin", ",",  
            " nunc leo ornare purus", ",", " a dapibus dolor lectus id nisi", ".", " Sed ligula sem", ",", " gravida interdum sodales ac", ",",  
            " rutrum nec tortor", ".", " Nunc sed tristique turpis", ".", " Maecenas diam turpis", ",", " pulvinar eget dignissim at", ",",  
            " convallis quis erat", "!", " Mauris pretium malesuada tortor", ",", " vel aliquet eros sodales ut", ".",  
            " Vivamus id massa et sem luctus pretium", ".", " Duis cursus lacinia feugiat", ".", " Sed scelerisque sem vel diam feugiat pharetra",  
            ".", " Donec non tortor sit amet sem placerat suscipit", ".", " Integer consequat urna sed orci suscipit porttitor nec et eros", ".",  
            " Sed ullamcorper dictum lorem nec adipiscing", "?", " Aliquam eget mauris eget ipsum pretium accumsan at vel enim",  
            ".", ""].toString() === /*fixed behaviors result as in msie*/["Quisque ut blandit risus", ".", " Integer vehicula", ",",  
            " arcu et placerat sollicitudin", ",", " nunc leo ornare purus", ",", " a dapibus dolor lectus id nisi", ".", " Sed ligula sem", ",",  
            " gravida interdum sodales ac", ",", " rutrum nec tortor", ".", " Nunc sed tristique turpis", ".", " Maecenas diam turpis", ",",  
            " pulvinar eget dignissim at", ",", " convallis quis erat", "!", " Mauris pretium malesuada tortor", ",",  
            " vel aliquet eros sodales ut", ".", " Vivamus id massa et sem luctus pretium", ".", " Duis cursus lacinia feugiat", ".",  
            " Sed scelerisque sem vel diam feugiat pharetra", ".", " Donec non tortor sit amet sem placerat suscipit", ".",  
            " Integer consequat urna sed orci suscipit porttitor nec et eros", ".", " Sed ullamcorper dictum lorem nec adipiscing", "?",  
            " Aliquam eget mauris eget ipsum pretium accumsan at vel enim", ".", ""].toString()); // true
            

            so long - peterS. - pseliger@gmx.net

            --
            »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
            Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
            ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
            1. Hi,

              @ChrisB - ich bin bis heut' im traum nicht auf den gedanken gekommen,
              funktionierendes capture verhalten von RegX-en bei [split] auch nur
              zu unterstellen - nie versucht

              Ich schon [1] - bei DOM-Manipulationen "per" innerHTML.
              Ich wollte sämtlichen Textinhalt bearbeiten, und benötigte während der Bearbeitung eines Textknotens auch noch lesenden Zugriff auf den jeweils vorhergehenden/nachfolgenden - extrem aufwendig, und auch nicht sonderlich performant, wenn man das wirklich rekursiv per DOM-Methoden machen will.

              Also innerHTML eines Elements hernehmen, an allem was nach Tag aussieht (also basically <[^>]+> resp. </[^>]+>) splitten, dann durchlaufen und "Texknoten" (alles, was nicht leer ist und nicht mit < beginnt) bearbeiten, und anschliessend Array wieder joinen.

              • gleich ausprobiert - *funzt* in firefox und chrome - aber ...

              ... Nur der IE ist immer noch zu blöd dazu.

              Na was glaubst du, wie ich geschaut habe, als das Script während der Entwicklung im Firefox tat, was ich wollte - und dann beim anschliessenden Test im IE sämtliche Tags flöten gegangen sind ...

              Wie gesagt, eine Umschreibung auf Nutzung von String.match tat's dann auch, da musste ich dann nur noch dafür sorgen, dass alles was kein "Tag" ist, an dem ich sonst gesplittet hätte, ebenfalls noch gecaptured wurde.

              wollt' ich auch gleich mal selber haben - hier mein erster wurf einer generischen loesung

              Schau ich mir bei Gelegenheit mal an;
              Aber wie schon geschrieben, man findet auch schon "fertige" Lösungsvorschläge dazu im Netz (die hab ich mir nur damals nicht genauer angeschaut, weil mir mein Umweg über match dann doch immer noch der performantere erschien für das, was ich vor hatte).

              [1] Davon abgesehen, von anderen Implementierungen kennt man das ja auch, bei PHPs preg_split bspw., auch wenn es dort explizit über das Flag PREG_SPLIT_DELIM_CAPTURE aktiviert werden muss.

              MfG ChrisB

              --
              Light travels faster than sound - that's why most people appear bright until you hear them speak.