我如何分裂一个字符串与多个分隔符在JavaScript?

我试图拆分逗号和空格,但AFAIK JavaScript的split()函数只支持一个分隔符。


当前回答

你可以将一个正则表达式传递给JavaScript的split()方法。例如:

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

或者,如果你想让多个分隔符一起只起到一个作用:

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

您必须使用非捕获(?:)括号,因为 否则它会被拼接回结果中。或者你可以聪明一点 比如Aaron,使用一个角色类。

在Safari和Firefox中测试的示例。

其他回答

另一个简单而有效的方法是重复使用split + join。

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

从本质上讲,在连接之后进行拆分就像一个全局替换,所以这将每个分隔符替换为逗号,然后一旦所有分隔符都被替换,它将在逗号上进行最后的拆分

上述表达式的结果是:

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

在此基础上,你还可以把它放在一个函数中:

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

用法:

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

如果你经常使用这个功能,为了方便起见,甚至可以考虑包装String.prototype.split(我认为我的函数是相当安全的——唯一需要考虑的是附加的条件开销(minor),以及如果传递一个数组,它缺乏limit参数的实现)。

如果使用下面的方法只是简单地包装它,请确保包含splitMulti函数:)。同样值得注意的是,有些人不喜欢扩展内置(因为很多人都做错了,可能会发生冲突),所以如果有疑问,请在使用这个之前向更高级的人说话或询问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
    };

用法:

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

享受吧!

例如,如果你在String 07:05:45PM中使用了split and replace

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

结果

[ '07', '05', '45' ]

你可以将一个正则表达式传递给JavaScript的split()方法。例如:

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

或者,如果你想让多个分隔符一起只起到一个作用:

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

您必须使用非捕获(?:)括号,因为 否则它会被拼接回结果中。或者你可以聪明一点 比如Aaron,使用一个角色类。

在Safari和Firefox中测试的示例。

不是最好的方法,但适用于使用多个和不同的分隔符/分隔符进行分割

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>

我将为这样的函数提供一个经典的实现。代码可以在几乎所有版本的JavaScript中运行,并且在某种程度上是最优的。

它不使用正则表达式,这很难维护 它没有使用JavaScript的新特性 它不使用需要更多计算机内存的多次.split() .join()调用

只是纯代码:

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

你可以看到代码在playground中运行: https://codeguppy.com/code.html?IJI0E4OGnkyTZnoszAzf