如何仅将字符串拆分一次,即使得1 | Ceci n'est pas une pipe: | Oui
解析为:["1","Ceci n'est pas une pipe: | Oui"]
?
使用split中的limit似乎无法实现...
如何仅将字符串拆分一次,即使得1 | Ceci n'est pas une pipe: | Oui
解析为:["1","Ceci n'est pas une pipe: | Oui"]
?
使用split中的limit似乎无法实现...
就像迄今为止大多数答案一样邪恶:
var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
除了其他好的方法外,另一个简洁的方法是利用replace()
的限制。
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
var str = "1|Ceci n'est pas une pipe: | Oui";
str.split(/(?<!\|.*)\|/s);
使用这个正则表达式,它会找到第一个"|"之前没有"|",也就是只匹配第一个"|"。
如果你想使用“管道”,reduce
是你的好朋友
const separator = '|'
jsonNode.split(separator)
.reduce((previous, current, index) =>
{
if (index < 2) previous.push(current)
else previous[1] += `${separator}${current}`
return previous
}, [])
.map((item: string) => (item.trim()))
.filter((item: string) => (item != ''))
这是一个老问题,但如果您需要循环遍历字符串,并且有多个分隔符,请使用正则表达式进行匹配,像这样:
let exampleRegexp = />|<|=|\||(?:and|not|etc)/
let strings = ["left | middle | right", "yes and not yes"]
function splitOnce(str, regexp){
let check = regexp.exec(str)
let tail = str.slice(check.index + check.toString().length)
let head = str.substring(0, check.index)
return [head, tail]
}
for(let str of strings){
let [head, tail] = splitOnce(str, exampleRegexp)
console.log(head + ":::" + tail)
}
这个有点长,但它的工作方式就像我认为的限制应该的那样:
function split_limit(inString, separator, limit){
var ary = inString.split(separator);
var aryOut = ary.slice(0, limit - 1);
if(ary[limit - 1]){
aryOut.push(ary.slice(limit - 1).join(separator));
}
return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));
https://jsfiddle.net/2gyxuo2j/
零的限制会返回有趣的结果,但为了效率,我省略了对它的检查。如果需要,您可以将其添加为函数的第一行:
if(limit < 1) return [];
使用JavaScript正则表达式功能并获取第一个捕获的表达式。
正则表达式可能看起来像/^([^|]*)\|/
。
实际上,如果您验证了字符串以这种方式格式化,由于JavaScript正则表达式的贪婪性,您只需要/[^|]*/
。
.split
的解决方案比`s.indexOf(...); s.slice(); /* OR: s.substring() */差得多。在Chrome和NodeJS中,“差得多”意味着它们慢了约90%。 - maxkoryukov