如何分割字符串一次,即将1|Ceci n'est pas une pipe: | Oui
解析为:["1", "Ceci n'est pas une pipe: | Oui"]
?在javascript中分割字符串一次?
斯普利特限制似乎并没有帮助...
如何分割字符串一次,即将1|Ceci n'est pas une pipe: | Oui
解析为:["1", "Ceci n'est pas une pipe: | Oui"]
?在javascript中分割字符串一次?
斯普利特限制似乎并没有帮助...
这是不是一个漂亮的方法,但体面的工作效率:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
您可以使用:
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
正则表达式分割字符串成两个匹配的组(括号),之前的第一个文本|和之后的文字。然后,我们shift
结果摆脱了整个字符串匹配(splits[0]
)。
试试这个:
function splitOnce(input, splitBy) {
var fullSplit = input.split(splitBy);
var retVal = [];
retVal.push(fullSplit.shift());
retVal.push(fullSplit.join(splitBy));
return retVal;
}
var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');
使用JavaScript正则表达式的功能和拿第一捕获的表达。
RE可能看起来像/^([^|]*)\|/
。
实际上,只需要/[^|]*/
如果您验证字符串是以这种方式格式化的,由于javascript正则表达式贪婪。
正如邪为大部分的答案至今:
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");
由于@sreservoir在评论中指出的,独特的短语必须是真正独一无二的 - 它不能在源你在运行这种分裂,否则你会得到字符串分割成多块比你想要的。正如他所说,一个不可打印的字符可能会对用户输入(即在浏览器中输入)执行此操作。
只有在'唯一'短语不可信的情况下才有效。如果从文本文件中读取,这是不可能的。如果从浏览器中读取任何不可打印的控制字符(如果可能的话)。标签也可以创造奇迹。无论如何,“aUniquePhraseToSaySplitMe”几乎肯定可能是输入的一部分,因此是危险的。 – muhmuhten 2010-05-21 00:11:57
你当然是对的。我的例子只是一个例子,着眼于解释正在做什么简洁。我将把你的观点纳入答案本身。谢谢! – 2010-05-21 00:17:11
如果你使用str来表达你的独特的短语,你就知道它不能再在那里了! :邪恶的笑容 – 2015-01-06 16:32:59
一个衬垫和海事组织简单:
var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');
这将返回 “是超|酷|啊!”
这不是被要求的,他们也在寻找失踪的第一部分。 – SmujMaiku 2017-11-05 19:52:09
如果字符串不包含分隔符@ 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"]
这其中的时间稍长,但它就像我相信限值应:
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 [];
这实际上比正则表达式更好,我想。选择正确的,谢谢! – 2010-05-21 00:14:42
为了澄清,他分裂成N部分,然后将第一部分弹出到列表中,并将其余部分加入到同一列表中。 – 2010-05-21 00:15:06
如果要从字符串中取出k个令牌,而不是1,请执行上述操作,但使用components.splice(0,k)而不是components.shift()。 – 2013-08-19 07:29:04