如何分割字符串一次,即將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