Как разбить строку только один раз, т. Е. Сделать 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", '|');
использовать яваскрипт функциональность регулярных выражений и взять первый захваченное выражение.
RE, вероятно, будет выглядеть как /^([^|]*)\|/
.
Фактически, вам нужно только /[^|]*/
, если вы подтвердили, что строка отформатирована таким образом, из-за жадности javascript regex.
Чтобы получить индекс первого появления '|', вы должны использовать String.indexOf('|')
.
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
Подобно тому, как зло, как большинство ответов до сих пор:
var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
альтернативный, короткий подход, кроме тех товаров в других странах, является использование replace()
«s предел в ваших интересах.
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
Как @sreservoir указывает в комментариях, уникальная фраза должна быть по-настоящему уникален - он не может быть в источнике вы используете этот раскол закончится, или вы получите строку, разбитый на несколько частей чем вы хотите. Непечатаемый персонаж, по его словам, может делать, если вы используете его для ввода пользователя (т. Е. Набрал в браузере).
, который работает только в том случае, если «уникальная» фраза неоспорима. если чтение из текстового файла, это невозможно. если вы читаете из браузера, любой непечатаемый символ управления, если, вероятно, хорошо. вклад работает чудеса тоже. в любом случае «aUniquePhraseToSaySplitMe» почти наверняка является частью входа и, следовательно, опасен. – muhmuhten
Вы, конечно, правы. Мой пример - всего лишь пример с прицелом на объяснение того, что делается кратко. Я включу вашу точку в сам ответ. Благодаря! –
Если вы используете str для своей уникальной фразы, вы знаете, что ее снова не может быть! : evil grin –
один лайнер и имо, проще:
var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');
Это возвращает "Я супер | прохладное | да!"
Это не то, о чем просили, они тоже ищут недостающую первую часть. – SmujMaiku
Если строка не содержит разделителя @, решение NicCraver по-прежнему будет возвращать массив из двух элементов, второй - пустую строку. Я предпочитаю, чтобы поведение соответствовало поведению 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"]
Это одна немного больше, но это работает, как я считаю, предел должен:
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 [];
Это действительно лучше, чем regex, я думаю. Выбрано как правильно, спасибо! –
Чтобы уточнить, он разбивается на N частей, а затем открывает первый в список и присоединяет остальных к одному списку. –
Если вы хотите получить k токенов со строки вместо 1, сделайте то же самое, что и выше, за исключением использования components.splice (0, k) вместо components.shift(). –