如何分割一个字符串与多个分隔符在JavaScript中?
如何在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中测试的例子)
整蛊方法:
var s = "dasdnk asd, (naks) :d skldma"; var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' '); console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
另一个简单但便宜又讨厌的方法是反复使用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 = 0; 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
函数,如果使用这种方法下面简单地包装它:)。 另外值得注意的是,有些人对扩展内置插件不满(因为很多人会犯错误和冲突),所以如果有疑问在使用这个之前对某个更高级的用户说话,或者就这么说吧:)
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或更多”)
var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
对于那些想在分割函数中进行更多自定义的人,我写了一个递归算法,将给定的字符串拆分为一个字符列表。 我在看到上面的帖子之前写了这个。 我希望它能帮助一些沮丧的程序员。
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);
上面的例子返回: ["people", "and", "other", "things"]
注意: flatten
功能取自Rosetta Code
你可以将所有你想用作分隔符的字符单独或集体地转换成一个正则表达式,并将它们传递给split函数。 比如你可以写:
console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );
输出将是:
["dasdnk", "asd", "naks", ":d", "skldma"]
也许你应该做一些字符串替换,把一个分隔符变成另一个分隔符,所以你只有一个分隔符来处理你的分割。
嗨,例如,如果你有拆分和替换字符串07:05:45 PM
var hour = time.replace("PM", "").split(":");
结果
[ '07', '05', '45' ]
我发现我需要的一个主要原因是在/
和\
上分割文件路径。 这是一个棘手的正则表达式,所以我会张贴在这里作为参考:
var splitFilePath = filePath.split(/[\/\\]/);
如果你指定了你想要离开的东西,而不是你想要删除的东西,
就好像你只想要英文单词一样,你可以使用像这样的东西:
text.match(/[a-z'\-]+/gi);
示例(运行代码段):
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>
从@stephen-sweriduk解决方案开始(这对我来说更有趣!),我稍微修改了它,使其更加通用和可重用:
/** * 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); }) }, }
接着
var stringToSplit = "people and_other/things"; var splitList = [" ", "_", "/"]; var splittedString=StringUtils.splitString(stringToSplit, splitList); console.log(splitList, stringToSplit, splittedString);
作为原来的回报:
[ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
我不知道RegEx的性能,但这里是RegEx利用本机HashSet的另一种替代方法,它在O(max(str.length,delimeter.length))复杂性中起作用:
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"]
一个简单的方法是使用每个分隔符处理字符串的每个字符并构建一个分组数组:
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;}
我使用正则表达式:
str = 'Write a program that extracts from a given text all palindromes, eg "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"]