10 ответов:
это не очень хороший подход, но работает с приличной эффективностью:
var string = "1|Ceci n'est pas une pipe: | Oui"; var components = string.split('|'); alert([components.shift(), components.join('|')]);
Вы хотели бы использовать
String.indexOf('|')получить индекс первого вхождения '|'.var i = s.indexOf('|'); var splits = [s.slice(0,i), s.slice(i+1)];
вы можете использовать:
var splits = str.match(/([^|]*)\|(.*)/); splits.shift();регулярное выражение разбивает строку на две соответствующие группы (в скобках), текст, предшествующий первому | и текст после. Тогда мы
shiftрезультат, чтобы избавиться от всей строки матча (splits[0]).
один лайнер и Имо, проще:
var str = 'I | am super | cool | yea!'; str.split('|').slice(1).join('|');Это возвращает " am super / cool / yea!"
попробуйте это:
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", '|');
если строка не содержит разделителя, решение @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"]
так же зло, как и большинство ответов до сих пор:
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");
Это немного дольше, но он работает так, как я считаю предел должен:
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 [];
используйте функцию регулярных выражений javascript и возьмите первое захваченное выражение.
огонь, вероятно, будет выглядеть как
/^([^|]*)\|/.на самом деле, вам только нужно
/[^|]*/Если вы проверили, что строка отформатирована таким образом, из-за жадности JavaScript regex.
Comments