How do I split a string with multiple separators in javascript?

前端 未结 22 1574
走了就别回头了
走了就别回头了 2020-11-21 23:14

How do I split a string with multiple separators in JavaScript? I\'m trying to split on both commas and spaces but, AFAIK, JS\'s split function only supports one separator.

相关标签:
22条回答
  • 2020-11-21 23:33

    Here is a new way to achieving same in ES6:

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

    Please note in this function:

    • No Regex involved
    • Returns splitted value in same order as it appears in source

    Result of above code would be:

    0 讨论(0)
  • 2020-11-21 23:33

    Starting from @stephen-sweriduk solution (that was the more interesting to me!), I have slightly modified it to make more generic and reusable:

    /**
     * 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);
        })
      },
    
    }
    

    and then

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

    that gives back as the original:

    [ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
    
    0 讨论(0)
  • 2020-11-21 23:34

    I find that one of the main reasons I need this is to split file paths on both / and \. It's a bit of a tricky regex so I'll post it here for reference:

    var splitFilePath = filePath.split(/[\/\\]/);
    
    0 讨论(0)
  • 2020-11-21 23:36

    I will provide a classic implementation for a such function. The code works in almost all versions of JavaScript and is somehow optimum.

    • It doesn't uses regex, which is hard to maintain
    • It doesn't uses new features of JavaScript
    • It doesn't uses multiple .split() .join() invocation which require more computer memory

    Just pure code:

    var text = "Create a function, that will return an array (of string), with the words inside the text";
    
    println(getWords(text));
    
    function getWords(text)
    {
        let startWord = -1;
        let ar = [];
    
        for(let i = 0; i <= text.length; i++)
        {
            let c = i < text.length ? text[i] : " ";
    
            if (!isSeparator(c) && startWord < 0)
            {
                startWord = i;
            }
    
            if (isSeparator(c) && startWord >= 0)
            {
                let word = text.substring(startWord, i);
                ar.push(word);
    
                startWord = -1;
            }
        }
    
        return ar;
    }
    
    function isSeparator(c)
    {
        var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?", "(", ")"];
        return separators.includes(c);
    }
    

    You can see the code running in playground: https://codeguppy.com/code.html?IJI0E4OGnkyTZnoszAzf

    0 讨论(0)
  • 2020-11-21 23:38

    Not the best way but works to Split with Multiple and Different seperators/delimiters

    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 讨论(0)
  • 2020-11-21 23:39

    You could just lump all the characters you want to use as separators either singularly or collectively into a regular expression and pass them to the split function. For instance you could write:

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

    And the output will be:

    ["dasdnk", "asd", "naks", ":d", "skldma"]
    
    0 讨论(0)
提交回复
热议问题