Разбить строку один раз в JavaScript? - PullRequest
68 голосов
/ 21 мая 2010

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

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

Ответы [ 11 ]

102 голосов
/ 21 мая 2010

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

var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
71 голосов
/ 21 мая 2010

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

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

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

13 голосов
/ 21 мая 2010

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

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

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

6 голосов
/ 26 ноября 2011

один лайнер и имо, проще:

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

Это возвращает "я супер | круто | да!"

3 голосов
/ 26 декабря 2011

Если строка не содержит разделитель, решение @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"]
3 голосов
/ 21 мая 2010

Попробуйте это:

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", '|');
1 голос
/ 21 мая 2010

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

var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
0 голосов
/ 15 февраля 2019

Синтаксис ES6 допускает другой подход:

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

, который также обрабатывает возможность строки, не имеющей |, возвращая пустую строку, а не пустую строку, что является более явным.

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

Pas de pipe? C'est null!

Я добавил этот ответ прежде всего для того, чтобы я мог сделать каламбур на символе канала, а также показать синтаксис es6 - удивительно, сколько людей до сих пор его не используют ...

0 голосов
/ 09 марта 2017

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

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 [];
0 голосов
/ 21 мая 2010

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

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

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

...