如何只将字符串拆分一次,即1|Ceci n'est pas une pipe: | Oui
解析为:["1", "Ceci n'est pas une pipe: | Oui"]
?
拆分的限制似乎无济于事...
如何只将字符串拆分一次,即1|Ceci n'est pas une pipe: | Oui
解析为:["1", "Ceci n'est pas une pipe: | Oui"]
?
拆分的限制似乎无济于事...
Answers:
这不是一个很漂亮的方法,但是效率很高:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
components.splice(0,2).slice(0,2)
您想使用它String.indexOf('|')
来获取首次出现的“ |”的索引。
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
+1
,如果超过一个字符,则实际上应为分隔符字符串的长度。
var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
您可以使用:
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
正则表达式将字符串分成两个匹配的组(用括号括起来),第一个|前面的文本 和之后的文字。然后,我们shift
得到摆脱整个字符串匹配(splits[0]
)的结果。
一个线性和imo,更简单:
var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');
这将返回“超级|很酷|是!”
ES6语法允许使用其他方法:
function splitOnce(s, on) {
[first, ...rest] = s.split(on)
return [first, rest.length > 0? rest.join(on) : null]
}
这也|
通过返回null而不是空字符串来处理不具有a的字符串的可能性,这更加明确。
splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]
splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]
Pas de pipe?没有空!
我添加此回复的主要目的是使我可以对竖线符号进行双关语,同时也可以展示es6语法-令人惊讶的是仍然有很多人不使用它...
如果该字符串不包含定界符,则@NickCraver的解决方案仍将返回包含两个元素的数组,第二个为空字符串。我更喜欢行为与分裂的行为相匹配。也就是说,如果输入字符串不包含定界符,则仅返回具有单个元素的数组。
var splitOnce = function(str, delim) {
var components = str.split(delim);
var result = [components.shift()];
if(components.length) {
result.push(components.join(delim));
}
return result;
};
splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]
除了其他地方的货物以外,另一种替代的简短方法是利用replace()
的限制来获取您的利益。
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
正如@sreservoir在评论中指出的那样,唯一短语必须是真正唯一的-它不能在运行此拆分的源中出现,否则您会将字符串拆分成比您想要的更多的片段。如他所说,如果您要根据用户输入(例如,在浏览器中键入)运行此字符,则可能会出现无法打印的字符。
这个时间要长一点,但它的工作方式就像我认为限制应该:
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 [];
如果您想使用“管道”,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 != ''))