2010-05-20 2 views

ответ

64

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

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

Here's a quick demo of it

+0

Это действительно лучше, чем regex, я думаю. Выбрано как правильно, спасибо! –

+2

Чтобы уточнить, он разбивается на N частей, а затем открывает первый в список и присоединяет остальных к одному списку. –

+0

Если вы хотите получить k токенов со строки вместо 1, сделайте то же самое, что и выше, за исключением использования components.splice (0, k) вместо components.shift(). –

12

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

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

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

+1

Протестировано и работает. 1+ для использования Regex. – Riley

+0

должным образом, что, вероятно, должно быть привязано к началу. однако javascript regexen кажется жадным. – muhmuhten

+0

А, спасибо за это, это должно сработать! –

3

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

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

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

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

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

88

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

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

Это также хорошее решение. –

+12

Не как «забава», как Ник, но, вероятно, более эффективная. Также обратите внимание, что символ '+ 1' должен фактически быть длиной строки разделителя, если имеется более одного символа. – devios1

+0

Почему это решение менее «весело»? – Bentley4

1

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

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

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

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

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

+0

, который работает только в том случае, если «уникальная» фраза неоспорима. если чтение из текстового файла, это невозможно. если вы читаете из браузера, любой непечатаемый символ управления, если, вероятно, хорошо. вклад работает чудеса тоже. в любом случае «aUniquePhraseToSaySplitMe» почти наверняка является частью входа и, следовательно, опасен. – muhmuhten

+0

Вы, конечно, правы. Мой пример - всего лишь пример с прицелом на объяснение того, что делается кратко. Я включу вашу точку в сам ответ. Благодаря! –

+0

Если вы используете str для своей уникальной фразы, вы знаете, что ее снова не может быть! : evil grin –

7

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

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

Это возвращает "Я супер | прохладное | да!"

+0

Это не то, о чем просили, они тоже ищут недостающую первую часть. – SmujMaiku

3

Если строка не содержит разделителя @, решение 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"] 
0

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

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 [];