2010-05-20 110 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 [];