2010-05-20 64 views

回答

64

这是不是一个漂亮的方法,但体面的工作效率:

var string = "1|Ceci n'est pas une pipe: | Oui"; 
var components = string.split('|'); 
alert([components.shift(), components.join('|')]​);​​​​​ 

Here's a quick demo of it

+0

这实际上比正则表达式更好,我想。选择正确的,谢谢! – 2010-05-21 00:14:42

+2

为了澄清,他分裂成N部分,然后将第一部分弹出到列表中,并将其余部分加入到同一列表中。 – 2010-05-21 00:15:06

+0

如果要从字符串中取出k个令牌,而不是1,请执行上述操作,但使用components.splice(0,k)而不是components.shift()。 – 2013-08-19 07:29:04

12

您可以使用:

var splits = str.match(/([^|]*)\|(.*)/); 
splits.shift(); 

正则表达式分割字符串成两个匹配的组(括号),之前的第一个文本|和之后的文字。然后,我们shift结果摆脱了整个字符串匹配(splits[0])。

+1

测试此代码并工作。 1+使用正则表达式。 – Riley 2010-05-21 00:03:00

+0

正确,这应该在开始时锚定。然而,JavaScript regexen似乎是贪婪的。 – muhmuhten 2010-05-21 00:05:19

+0

啊,谢谢你,这应该工作! – 2010-05-21 00:06:56

3

试试这个:

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", '|'); 
0

使用JavaScript正则表达式的功能和拿第一捕获的表达。

RE可能看起来像/^([^|]*)\|/

实际上,只需要/[^|]*/如果您验证字符串是以这种方式格式化的,由于javascript正则表达式贪婪。

88

您希望使用String.indexOf('|')来获取第一次出现'|'的索引。

var i = s.indexOf('|'); 
var splits = [s.slice(0,i), s.slice(i+1)]; 
+0

这也是一个好的解决方案。 – 2010-05-21 00:23:49

+12

不像尼克那样“有趣”,但可能更有效。还要注意,如果多于一个字符,'+ 1'实际上应该是分隔符字符串的长度。 – devios1 2012-02-02 16:23:38

+0

为什么这个解决方案不那么“有趣”? – Bentley4 2014-03-30 10:14:53

1

正如邪为大部分的答案至今:

var splits = str.split('|'); 
splits.splice(1, splits.length - 1, splits.slice(1).join('|')); 
0

的替代,短期的做法,除了其他地方的货物的,就是用replace()的限制,你的优势。

var str = "1|Ceci n'est pas une pipe: | Oui"; 
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe"); 

由于@sreservoir在评论中指出的,独特的短语必须是真正独一无二的 - 它不能在源你在运行这种分裂,否则你会得到字符串分割成多块比你想要的。正如他所说,一个不可打印的字符可能会对用户输入(即在浏览器中输入)执行此操作。

+0

只有在'唯一'短语不可信的情况下才有效。如果从文本文件中读取,这是不可能的。如果从浏览器中读取任何不可打印的控制字符(如果可能的话)。标签也可以创造奇迹。无论如何,“aUniquePhraseToSaySplitMe”几乎肯定可能是输入的一部分,因此是危险的。 – muhmuhten 2010-05-21 00:11:57

+0

你当然是对的。我的例子只是一个例子,着眼于解释正在做什么简洁。我将把你的观点纳入答案本身。谢谢! – 2010-05-21 00:17:11

+0

如果你使用str来表达你的独特的短语,你就知道它不能再在那里了! :邪恶的笑容 – 2015-01-06 16:32:59

7

一个衬垫和海事组织简单:

var str = 'I | am super | cool | yea!'; 
str.split('|').slice(1).join('|'); 

这将返回 “是超|酷|啊!”

+0

这不是被要求的,他们也在寻找失踪的第一部分。 – SmujMaiku 2017-11-05 19:52:09

3

如果字符串不包含分隔符@ 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"] 
0

这其中的时间稍长,但它就像我相信限值应:

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 [];