精確解問:
function megasplit(toSplit, splitters) {
var splitters = splitters.sorted(function(a,b) {return b.length-a.length});
// sort by length; put here for readability, trivial to separate rest of function into helper function
if (!splitters.length)
return toSplit;
else {
var token = splitters[0];
return toSplit
.split(token) // split on token
.map(function(segment) { // recurse on segments
return megasplit(segment, splitters.slice(1))
})
.intersperse(token) // re-insert token
.flatten() // rejoin segments
.filter(Boolean);
}
}
演示:
> megasplit(
"Go ye away, I want some peace && quiet. & Thanks.",
["Go ", ",", "&&", "&", "."]
)
["Go ", "ye away", ",", " I want some peace ", "&", "&", " quiet", ".", " ", "&", " Thanks", "."]
機械(可重複使用!):
Array.prototype.copy = function() {
return this.slice()
}
Array.prototype.sorted = function() {
var copy = this.copy();
copy.sort.apply(copy, arguments);
return copy;
}
Array.prototype.flatten = function() {
return [].concat.apply([], this)
}
Array.prototype.mapFlatten = function() {
return this.map.apply(this,arguments).flatten()
}
Array.prototype.intersperse = function(token) {
// [1,2,3].intersperse('x') -> [1,'x',2,'x',3]
return this.mapFlatten(function(x){return [token,x]}).slice(1)
}
注:
- 這需要研究的一個體面的數額做優雅:
- 這由事實進一步複雜化要求令牌(雖然他們在字符串中被拋)不應該被分割(否則你會得到
"&", "&"
)的規範。這使得使用reduce
不可能的,必要的遞歸。
- 我還親自不會忽視與分裂空字符串。我可以理解不想遞歸地分割令牌,但我個人簡化功能,並使輸出像正常
.split
和["", "Go ", "ye away", ",", " I want some peace ", "&&", " quiet", ".", " ", "&", " Thanks", ".", ""]
- 我應該指出,如果你願意放鬆你的要求一點,這正好從一個15/20-襯墊到三分之一襯裏:
如果一個跟隨典型分裂行爲1-襯墊:
Array.prototype.mapFlatten = function() {
...
}
function megasplit(toSplit, splitters) {
return splitters.sorted(...).reduce(function(strings, token) {
return strings.mapFlatten(function(s){return s.split(token)});
}, [toSplit]);
}
3內膽,如果上面是難以閱讀:
Array.prototype.mapFlatten = function() {
...
}
function megasplit(toSplit, splitters) {
var strings = [toSplit];
splitters.sorted(...).forEach(function(token) {
strings = strings.mapFlatten(function(s){return s.split(token)});
});
return strings;
}
應該' 「你們 」'和'「 離開」'分裂?似乎這應該只是一個,如果我理解。 –
您是否想將「」作爲您的分隔符之一?你的輸出似乎表明,但你的輸入沒有。 –
@kingjiv是的,那是一個錯誤。現在應該修好了。 –