it-swarm.com.de

Wie teile ich eine Zeichenfolge mit mehreren Trennzeichen in Javascript auf?

Wie teile ich eine Zeichenfolge mit mehreren Trennzeichen in JavaScript auf? Ich versuche sowohl in Kommas als auch in Leerzeichen aufzuteilen, aber die Split-Funktion von JS unterstützt, wie AFAIK, nur ein Trennzeichen.

397
sol

Übergeben Sie einen Regex als Parameter:

js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!

Zum Hinzufügen hinzugefügt:

Sie erhalten das letzte Element, indem Sie die Länge des Arrays minus 1 auswählen:

>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

... und wenn das Muster nicht passt:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
577
Aaron Maenpaa

Sie können einen Regex an den Split-Operator von Javascript übergeben. Zum Beispiel:

"1,2 3".split(/,| /) 
["1", "2", "3"]

Oder, wenn Sie mehrere Trennzeichen gemeinsam als einzige zulassen möchten:

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(Sie müssen die nicht-erfassenden (?) - Parens verwenden, da sonst das Ergebnis wieder zusammengefügt wird. Oder Sie können klug wie Aaron sein und eine Charakterklasse verwenden.)

(Beispiele getestet in Safari + FF)

154
Jesse Rusak

Eine weitere einfache, aber effektive Methode ist die wiederholte Verwendung von split + join.

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

Das Aufteilen einer Aufteilung gefolgt von einem Join ist im Wesentlichen wie ein globales Ersetzen, sodass jedes Trennzeichen durch ein Komma ersetzt wird. Sobald alle ersetzt sind, führt es eine letzte Aufteilung in ein Komma aus

Das Ergebnis des obigen Ausdrucks lautet:

['a', 'b', 'c', 'd']

Wenn Sie dies erweitern, können Sie es auch in eine Funktion einfügen:

function splitMulti(str, tokens){
        var tempChar = tokens[0]; // We can use the first token as a temporary join character
        for(var i = 1; i < tokens.length; i++){
            str = str.split(tokens[i]).join(tempChar);
        }
        str = str.split(tempChar);
        return str;
}

Verwendungszweck: 

splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]

Wenn Sie diese Funktion häufig verwenden, lohnt es sich möglicherweise, String.prototype.split für die Bequemlichkeit zu verwenden (ich denke, dass meine Funktion ziemlich sicher ist. Die einzige Überlegung ist der zusätzliche Overhead der Bedingungen (Minor) und die Tatsache, dass das Limit nicht implementiert ist Argument, wenn ein Array übergeben wird).

Stellen Sie sicher, dass Sie die splitMulti-Funktion einschließen, wenn Sie diese Methode verwenden, um sie unten einzuhüllen :). Es ist auch erwähnenswert, dass einige Leute die Erweiterung der eingebauten Funktionen stirnrunzeln (da viele Leute dies falsch machen und Konflikte auftreten können). Wenn Sie also Zweifel haben, sprechen Sie mit einem älteren Benutzer, bevor Sie dies verwenden, oder fragen Sie nach SO :) 

    var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
    String.prototype.split = function (){
        if(arguments[0].length > 0){
            if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
                return splitMulti(this, arguments[0]);  // Call splitMulti
            }
        }
        return splitOrig.apply(this, arguments); // Call original split maintaining context
    };

Verwendungszweck:

var a = "a=b,c:d";
    a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
        a.split('='); // ["a", "b,c:d"] 

Genießen!

33
Brian

Lass es einfach sein: (füge ein "[] ​​+" zu deinem RegEx hinzu, bedeutet "1 oder mehr")

Dies bedeutet, dass "+" und "{1,}" gleich sind.

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
12
htmlfarmer

Heikle Methode:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
11
user669677

Für diejenigen von Ihnen, die mehr Anpassungsmöglichkeiten in ihrer Aufteilungsfunktion haben möchten, habe ich einen rekursiven Algorithmus geschrieben, der eine gegebene Zeichenfolge mit einer Liste von Zeichen teilt, nach denen sie aufgeteilt werden soll. Ich habe das geschrieben, bevor ich den obigen Beitrag gesehen habe. Ich hoffe, es hilft einigen frustrierten Programmierern.

splitString = function(string, splitters) {
    var list = [string];
    for(var i=0, len=splitters.length; i<len; i++) {
        traverseList(list, splitters[i], 0);
    }
    return flatten(list);
}

traverseList = function(list, splitter, index) {
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != list[index].split(splitter)) ? list[index] = list[index].split(splitter) : null;
        (list[index].constructor === Array) ? traverseList(list[index], splitter, 0) : null;
        (list.constructor === Array) ? traverseList(list, splitter, index+1) : null;    
    }
}

flatten = function(arr) {
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? flatten(val) : val);
    },[]);
}

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
splitString(stringToSplit, splitList);

Das obige Beispiel gibt Folgendes zurück: ["people", "and", "other", "things"]

Hinweis: Die flatten-Funktion wurde aus Rosetta-Code übernommen. 

7

Sie können einfach alle Zeichen, die Sie als Trennzeichen verwenden möchten, entweder einzeln oder zusammen in einen regulären Ausdruck fassen und an die Split-Funktion übergeben. Zum Beispiel könnten Sie schreiben:

console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );

Und die Ausgabe wird sein:

["dasdnk", "asd", "naks", ":d", "skldma"]
6
PeterKA

Vielleicht sollten Sie eine Art String ersetzen, um ein Trennzeichen in ein anderes Trennzeichen umzuwandeln, so dass Sie in Ihrem Split nur ein Trennzeichen verwenden müssen.

3
TheTXI

Hallo zum Beispiel, wenn Sie in String 07:05:45 PM aufgeteilt und ersetzt haben 

var hour = time.replace("PM", "").split(":");

Ergebnis

[ '07', '05', '45' ]
2
a = "a=b,c:d"

array = ['=',',',':'];

for(i=0; i< array.length; i++){ a= a.split(array[i]).join(); }

dadurch wird die Zeichenfolge ohne Sonderzeichen zurückgegeben.

1
gaurav krishna

Ausgehend von der @ stephen-sweriduk-Lösung (das war für mich am interessantesten!), Habe ich sie leicht modifiziert, um generischer und wiederverwendbarer zu werden:

/**
 * Adapted from: http://stackoverflow.com/questions/650022/how-do-i-split-a-string-with-multiple-separators-in-javascript
*/
var StringUtils = {

  /**
   * Flatten a list of strings
   * http://rosettacode.org/wiki/Flatten_a_list
   */
  flatten : function(arr) {
    var self=this;
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? self.flatten(val) : val);
    },[]);
  },

  /**
   * Recursively Traverse a list and apply a function to each item
   * @param list array
   * @param expression Expression to use in func
   * @param func function of (item,expression) to apply expression to item
   *
   */
  traverseListFunc : function(list, expression, index, func) {
    var self=this;
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != func(list[index], expression)) ? list[index] = func(list[index], expression) : null;
        (list[index].constructor === Array) ? self.traverseListFunc(list[index], expression, 0, func) : null;
        (list.constructor === Array) ? self.traverseListFunc(list, expression, index+1, func) : null;
    }
  },

  /**
   * Recursively map function to string
   * @param string
   * @param expression Expression to apply to func
   * @param function of (item, expressions[i])
   */
  mapFuncToString : function(string, expressions, func) {
    var self=this;
    var list = [string];
    for(var i=0, len=expressions.length; i<len; i++) {
        self.traverseListFunc(list, expressions[i], 0, func);
    }
    return self.flatten(list);
  },

  /**
   * Split a string
   * @param splitters Array of characters to apply the split
   */
  splitString : function(string, splitters) {
    return this.mapFuncToString(string, splitters, function(item, expression) {
      return item.split(expression);
    })
  },

}

und dann

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
var splittedString=StringUtils.splitString(stringToSplit, splitList);
console.log(splitList, stringToSplit, splittedString);

das gibt als original zurück:

[ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
1
loretoparisi

Eine einfache Möglichkeit, dies zu tun, besteht darin, jedes Zeichen der Zeichenfolge mit jedem Trennzeichen zu verarbeiten und ein Array der Aufteilungen aufzubauen:

splix = function ()
{
  u = [].slice.call(arguments); v = u.slice(1); u = u[0]; w = [u]; x = 0;

  for (i = 0; i < u.length; ++i)
  {
    for (j = 0; j < v.length; ++j)
    {
      if (u.slice(i, i + v[j].length) == v[j])
      {
        y = w[x].split(v[j]); w[x] = y[0]; w[++x] = y[1];
      };
    };
  };

  return w;
};

console.logg = function ()
{
  document.body.innerHTML += "<br>" + [].slice.call(arguments).join();
}

splix = function() {
  u = [].slice.call(arguments);
  v = u.slice(1);
  u = u[0];
  w = [u];
  x = 0;
  console.logg("Processing: <code>" + JSON.stringify(w) + "</code>");

  for (i = 0; i < u.length; ++i) {
    for (j = 0; j < v.length; ++j) {
      console.logg("Processing: <code>[\x22" + u.slice(i, i + v[j].length) + "\x22, \x22" + v[j] + "\x22]</code>");
      if (u.slice(i, i + v[j].length) == v[j]) {
        y = w[x].split(v[j]);
        w[x] = y[0];
        w[++x] = y[1];
        console.logg("Currently processed: " + JSON.stringify(w) + "\n");
      };
    };
  };

  console.logg("Return: <code>" + JSON.stringify(w) + "</code>");
};

setTimeout(function() {
  console.clear();
  splix("1.23--4", ".", "--");
}, 250);
@import url("http://fonts.googleapis.com/css?family=Roboto");

body {font: 20px Roboto;}

Verwendung: splix(string, delimiters...)

Beispiel: splix("1.23--4", ".", "--")

Rückgabe: ["1", "23", "4"]

1
harr-will

Ich finde, einer der Hauptgründe, warum ich dies brauche, ist das Aufteilen der Dateipfade in / und \. Es ist ein bisschen eine knifflige Regex, also werde ich sie hier als Referenz posten:

var splitFilePath = filePath.split(/[\/\\]/);
0

Hier ist ein neuer Weg, um dasselbe in ES6 zu erreichen:

function SplitByString(source, splitBy) {
  var splitter = splitBy.split('');
  splitter.Push([source]); //Push initial value

  return splitter.reduceRight(function(accumulator, curValue) {
    var k = [];
    accumulator.forEach(v => k = [...k, ...v.split(curValue)]);
    return k;
  });
}

var source = "abc,def#hijk*lmn,opq#rst*uvw,xyz";
var splitBy = ",*#";
console.log(SplitByString(source, splitBy));

Bitte beachten Sie in dieser Funktion:

  • Kein Regex beteiligt
  • Gibt den aufgeteilten Wert in derselben Reihenfolge zurück, wie er in source angegeben ist.

Ergebnis des obigen Codes wäre:

enter image description here

0
Vishnu

Ich kenne die Leistung von RegEx nicht, aber hier ist eine weitere Alternative für RegEx, die das native HashSet nutzt, und arbeitet stattdessen in der Komplexität O (max.

var multiSplit = function(str,delimiter){
    if (!(delimiter instanceof Array))
        return str.split(delimiter);
    if (!delimiter || delimiter.length == 0)
        return [str];
    var hashSet = new Set(delimiter);
    if (hashSet.has(""))
        return str.split("");
    var lastIndex = 0;
    var result = [];
    for(var i = 0;i<str.length;i++){
        if (hashSet.has(str[i])){
            result.Push(str.substring(lastIndex,i));
            lastIndex = i+1;
        }
    }
    result.Push(str.substring(lastIndex));
    return result;
}

multiSplit('1,2,3.4.5.6 7 8 9',[',','.',' ']);
// Output: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]

multiSplit('1,2,3.4.5.6 7 8 9',' ');
// Output: ["1,2,3.4.5.6", "7", "8", "9"]
0
Orhun Alp Oral

Nicht der beste Weg, funktioniert aber mit mehreren und unterschiedlichen Trennzeichen/Trennzeichen

html

<button onclick="myFunction()">Split with Multiple and Different seperators/delimiters</button>
<p id="demo"></p>

javascript

<script>
function myFunction() {

var str = "How : are | you doing : today?";
var res = str.split(' | ');

var str2 = '';
var i;
for (i = 0; i < res.length; i++) { 
    str2 += res[i];

    if (i != res.length-1) {
      str2 += ",";
    }
}
var res2 = str2.split(' : ');

//you can add countless options (with or without space)

document.getElementById("demo").innerHTML = res2;
</script>
0
Stavros

Ich denke, es ist einfacher, wenn Sie angeben, was Sie verlassen möchten, anstatt das, was Sie entfernen möchten.

Als ob Sie nur englische Wörter haben möchten, können Sie so etwas verwenden:

text.match(/[a-z'\-]+/gi);

Beispiele (Run Snippet):

var R=[/[a-z'\-]+/gi,/[a-z'\-\s]+/gi];
var s=document.getElementById('s');
for(var i=0;i<R.length;i++)
 {
  var o=document.createElement('option');
  o.innerText=R[i]+'';
  o.value=i;
  s.appendChild(o);
 }
var t=document.getElementById('t');
var r=document.getElementById('r');

s.onchange=function()
 {
  r.innerHTML='';
  var x=s.value;
  if((x>=0)&&(x<R.length))
   x=t.value.match(R[x]);
  for(i=0;i<x.length;i++)
   {
    var li=document.createElement('li');
    li.innerText=x[i];
    r.appendChild(li);
   }
 }
<textarea id="t" style="width:70%;height:12em">even, test; spider-man

But saying o'er what I have said before:
My child is yet a stranger in the world;
She hath not seen the change of fourteen years,
Let two more summers wither in their pride,
Ere we may think her ripe to be a bride.

—Shakespeare, William. The Tragedy of Romeo and Juliet</textarea>

<p><select id="s">
 <option selected>Select a regular expression</option>
 <!-- option value="1">/[a-z'\-]+/gi</option>
 <option value="2">/[a-z'\-\s]+/gi</option -->
</select></p>
 <ol id="r" style="display:block;width:auto;border:1px inner;overflow:scroll;height:8em;max-height:10em;"></ol>
</div>

0
ESL