如何在JavaScript中拆分包含多个分隔符的字符串?我试图在逗号和空格上分开但是,AFAIK,JS的分割功能只支持一个分隔符.
传入正则表达式作为参数:
js> "Hello awesome, world!".split(/[\s,]+/) Hello,awesome,world!
编辑添加:
您可以通过选择数组长度减1来获取最后一个元素:
>>> bits = "Hello awesome, world!".split(/[\s,]+/) ["Hello", "awesome", "world!"] >>> bit = bits[bits.length - 1] "world!"
......如果模式不匹配:
>>> bits = "Hello awesome, world!".split(/foo/) ["Hello awesome, world!"] >>> bits[bits.length - 1] "Hello awesome, world!"
您可以将正则表达式传递给Javascript的拆分运算符.例如:
"1,2 3".split(/,| /) ["1", "2", "3"]
或者,如果您希望允许多个分隔符一起仅作为一个:
"1, 2, , 3".split(/(?:,| )+/) ["1", "2", "3"]
(你必须使用非捕获(?:) parens,否则它会被拼接回到结果中.或者你可以像Aaron一样聪明并使用一个字符类.)
(在Safari + FF中测试的示例)
另一种简单但有效的方法是重复使用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
以方便使用(我认为我的函数是相当安全的 - 唯一的考虑因素是条件(次要)的额外开销以及它缺少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"]
请享用!
让我们保持简单:(在您的RegEx中添加"[] +"表示"1或更多")
这意味着"+"和"{1,}"是相同的.
var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
棘手的方法:
var s = "dasdnk asd, (naks) :d skldma"; var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' '); console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
对于那些想要在分割函数中进行更多自定义的人,我编写了一个递归算法,该算法将给定字符串与要拆分的字符列表分开.在看到上面的帖子之前我写了这个.我希望它可以帮助一些沮丧的程序员.
splitString = function(string, splitters) { var list = [string]; for(var i=0, len=splitters.length; i以上示例返回:
["people", "and", "other", "things"]
注意:
flatten
功能取自Rosetta Code
7> PeterKA..:您可以将要用作分隔符的所有字符单独或共同整合到正则表达式中,并将它们传递给split函数.比如你可以写:
console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );输出将是:
["dasdnk", "asd", "naks", ":d", "skldma"]