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

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

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

Ответ 1

Это не очень хороший подход, но работает с достойной эффективностью:

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

Вот его краткая демонстрация

Ответ 2

Вы хотите использовать String.indexOf('|'), чтобы получить индекс первого вхождения '|'.

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

Ответ 3

Вы можете использовать:

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

Регулярное выражение разбивает строку на две сопоставимые группы (в скобках), текст, предшествующий первому | и текст после. Затем мы shift результат, чтобы избавиться от всего соответствия строки (splits[0]).

Ответ 4

один вкладыш и imo, проще:

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

Это возвращает "am super | cool | yea!"

Ответ 5

Попробуйте следующее:

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

Ответ 6

Если строка не содержит разделителя, то решение @NickCraver все равно вернет массив из двух элементов, второй - пустую строку. Я предпочитаю, чтобы поведение соответствовало поведению split. То есть, если входная строка не содержит разделителя, возвращаем только массив с одним элементом.

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"]

Ответ 7

Так же зло, как и большинство ответов до сих пор:

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

Ответ 8

используйте функцию регулярного выражения javascript и возьмите первое захваченное выражение.

RE, вероятно, будет выглядеть как /^([^|]*)\|/.

на самом деле вам нужно только /[^|]*/, если вы подтвердили, что строка отформатирована таким образом, из-за жадности javascript regex.

Ответ 9

Альтернативный короткий подход, помимо других товаров, должен использовать предел replace() в ваших интересах.

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

Как отмечает @sreservoir в комментариях, уникальная фраза должна быть поистине уникальной - она ​​не может быть в источнике, в котором вы выполняете этот сплит, или вы разделите строку на несколько частей, чем хотите. Непечатаемый персонаж, по его словам, может делать, если вы используете его для ввода пользователя (т.е. Набрал в браузере).

Ответ 10

Это немного дольше, но он работает, как я считаю, предел должен:

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/

limit of Zero возвращает смешные результаты, но во имя эффективности я оставил чек для него. Вы можете добавить это как первую строку функции, если вам это нужно:

if(limit < 1) return [];