Comment partager une chaîne de caractères avec plusieurs séparateurs en javascript?

Comment séparer une chaîne avec plusieurs séparateurs en JavaScript? J'essaie de diviser à la fois les virgules et les espaces mais, AFAIK, la fonction split DE JS ne supporte qu'un seul séparateur.

367
demandé sur mikemaccana 2009-03-16 14:25:52

16 réponses

passer dans un regexp que le paramètre:

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

modifié pour ajouter:

Vous pouvez obtenir le dernier élément en sélectionnant la longueur du tableau moins 1:

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

... et si le modèle ne correspond pas:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
542
répondu Aaron Maenpaa 2009-03-16 19:09:47

vous pouvez passer un regex dans JavaScript Split operator . Par exemple:

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

Ou, si vous voulez permettre à plusieurs séparateurs ensemble pour agir comme un seul:

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

(vous devez utiliser le non-capturing (?:) parens parce que sinon il se recoupe dans le résultat. Ou vous pouvez être intelligent comme Aaron et utiliser une classe de caractères.)

(exemples testés en Safari + FF)

135
répondu Jesse Rusak 2012-07-04 15:00:18

une autre méthode simple mais efficace est d'utiliser split + join de façon répétée.

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

essentiellement faire une fente suivie d'une jointure est comme un remplacement global donc cela remplace chaque séparateur avec une virgule puis une fois Tous sont remplacés il fait une fente finale sur la virgule

le résultat de l'expression ci-dessus est:

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

en développant sur ce que vous pourriez également le placer dans une fonction:

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;
}

Utilisation:

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

si vous utilisez cette fonctionnalité beaucoup, il pourrait même être utile d'envisager d'emballer String.prototype.split pour la commodité (je pense que ma fonction est assez sûre - la seule considération est la surcharge supplémentaire des conditionnels (mineur) et le fait qu'il manque une mise en œuvre de l'argument limite si un tableau est passé).

assurez-vous d'inclure la fonction splitMulti si vous utilisez cette approche à la ci-dessous simplement enveloppe :). Il convient également de noter que certaines personnes désapprouvent l'extension des built-in (car beaucoup de gens le font mal et des conflits peuvent se produire) donc, si dans le doute parler à quelqu'un de plus âgé avant d'utiliser ce ou Demander À 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
    };

Utilisation:

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"] 

Profitez-en!

25
répondu Brian 2018-03-18 01:23:15

restons simples: (ajouter un " [] + "à votre RegEx signifie" 1 ou plus")

cela signifie " + "Et" {1,} " sont les mêmes.

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

méthode délicate:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
10
répondu 2013-07-04 13:32:23

pour ceux d'entre vous qui veulent plus de personnalisation dans leur fonction de division, j'ai écrit un algorithme récursif qui divise une chaîne donnée avec une liste de caractères à diviser. J'ai écrit ceci avant de voir le post ci-dessus. J'espère que ça aidera les programmeurs frustrés.

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);

exemple ci-dessus retourne: ["people", "and", "other", "things"]

Note: flatten fonction a été prise de code Rosetta

7
répondu Stephen Sweriduk 2017-04-04 15:44:24

vous pouvez simplement regrouper tous les caractères que vous voulez utiliser comme séparateurs soit individuellement ou collectivement dans une expression régulière et les passer à la fonction split. Par exemple, vous pourriez écrire:

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

et la sortie sera:

["dasdnk", "asd", "naks", ":d", "skldma"]
5
répondu PeterKA 2014-04-22 04:46:15

peut-être que vous devriez faire une sorte de remplacement de chaîne de caractères pour transformer un séparateur en l'autre séparateur de sorte que vous avez alors seulement un séparateur à traiter dans votre Division.

3
répondu TheTXI 2009-03-16 11:28:49

Hi par exemple si vous avez fendu et remplacer dans la chaîne de caractères 07: 05: 45PM

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

résultat

[ '07', '05', '45' ]
2
répondu Ezequiel García 2016-03-09 13:36:13

à partir de @stephen-sweriduk solution (c'était le plus intéressant pour moi!), Je l'ai légèrement modifié pour le rendre plus générique et réutilisable:

/**
 * Adapted from: /q/how-do-i-split-a-string-with-multiple-separators-in-javascript-34763/"people and_other/things";
var splitList = [" ", "_", "/"];
var splittedString=StringUtils.splitString(stringToSplit, splitList);
console.log(splitList, stringToSplit, splittedString);

qui rend comme l'original:

[ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
1
répondu loretoparisi 2016-02-11 09:46:05

un moyen facile de faire ceci est de traiter chaque caractère de la chaîne avec chaque délimiteur et construire un tableau des divisions:

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;}

Utilisation: splix(string, delimiters...)

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

Retourne: ["1", "23", "4"]

1
répondu harr-will 2017-01-23 08:23:50

je trouve que l'une des principales raisons pour lesquelles j'ai besoin de cela est de diviser les chemins de fichiers sur / et \ . C'est un peu un regex délicat donc je vais le poster ici pour référence:

var splitFilePath = filePath.split(/[\/\]/);
0
répondu AlliterativeAlice 2015-07-13 16:19:12

je pense que c'est plus facile si vous spécifiez ce que vous voulez quitter, au lieu de ce que vous voulez supprimer.

comme si vous vouliez n'avoir que des mots anglais, vous pouvez utiliser quelque chose comme ceci:

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

Exemples (exécuter extrait):

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
répondu ESL 2015-08-25 13:25:38

Je ne sais pas la performance de RegEx, mais voici une autre alternative pour RegEx utilise le HashSet natif et fonctionne en O( max(str.longueur, delimètre.la longueur) ) complexité:

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
répondu Orhun Alp Oral 2016-10-25 11:38:40

Pas le meilleur moyen mais fonctionne à Split avec Plusieurs et Différents séparateurs/délimiteurs

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
répondu Stavros 2018-08-31 13:23:09

- je utiliser regexp:

str =  'Write a program that extracts from a given text all palindromes, e.g. "ABBA", "lamal", "exe".';

var strNew = str.match(/\w+/g);

// Output: ["Write", "a", "program", "that", "extracts", "from", "a", "given", "text", "all", "palindromes", "e", "g", "ABBA", "lamal", "exe"]
-3
répondu Dodi Ivanov 2015-04-02 05:09:26