Разделить строку один раз в javascript?



Как я могу разделить строку только один раз, т. е. сделать 1|Ceci n'est pas une pipe: | Oui parse to:["1", "Ceci n'est pas une pipe: | Oui"]?



предел в split, похоже, не помогает...

593   10  

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

    Ничего не найдено.