2010-05-20 9 views

Antwort

64

Das ist kein schöner Ansatz, sondern arbeitet mit anständiger Effizienz:

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

Das ist eigentlich besser als die Regex, denke ich. Als richtig ausgewählt, danke! –

+2

Um es zu verdeutlichen, teilt er sich in N Teile auf und knackt den ersten auf eine Liste und fügt den Rest der Liste hinzu. –

+0

Wenn Sie k Zeichen von der Zeichenfolge anstelle von 1 abziehen möchten, machen Sie dasselbe wie oben, aber verwenden Sie components.splice (0, k) anstelle von components.shift(). –

12

können Sie verwenden:

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

Die Regex die Zeichenfolge in zwei Gruppen gleicher spaltet (in Klammern), der Text des ersten voraus | und der Text nach. Dann haben wir shift das Ergebnis, um die ganze Übereinstimmung der Zeichenfolge loszuwerden (splits[0]).

+1

Getesteter dieser Code und funktioniert. 1+ für die Verwendung von Regex. – Riley

+0

richtig, das sollte wohl zu Beginn ankern. Javascript Regexen scheinen jedoch gierig zu sein. – muhmuhten

+0

Ah, danke dafür, das sollte funktionieren! –

3

Versuchen Sie folgendes:

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

JavaScript regulären Ausdruck Funktionalität nutzen und nehmen Sie die erste gefangener Ausdruck.

der RE würde wahrscheinlich wie /^([^|]*)\|/ aussehen.

eigentlich, Sie brauchen nur /[^|]*/, wenn Sie validiert, dass die Zeichenfolge so formatiert ist, wegen Javascript regex Gier.

88

Sie möchten String.indexOf('|') verwenden, um den Index des ersten Vorkommens von '|' zu erhalten.

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

Dies ist auch eine gute Lösung. –

+12

Nicht so "Spaß" wie Nick, aber wahrscheinlich effizienter. Beachten Sie auch, dass '+ 1' eigentlich die Länge der Trennzeichenfolge sein sollte, wenn mehr als ein Zeichen vorhanden ist. – devios1

+0

Warum ist diese Lösung weniger "Spaß"? – Bentley4

1

Genau so böse wie die meisten Antworten bisher:

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

eine alternative, kurze Ansatz neben den Waren diejenigen anderswo, ist replace() ‚s Grenze zu Ihrem Vorteil zu nutzen.

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

Wie @sreservoir in den Kommentaren weist darauf hin, muss der einzigartige Satz wirklich einzigartig sein - es kann nicht in der Quelle, die Sie diese Spaltung über laufen lassen, oder Sie werden die Zeichenfolge aufgeteilt in mehrere Stücke erhalten als du willst. Ein nicht druckbares Zeichen, wie er sagt, kann tun, wenn Sie dies gegen Benutzereingaben ausführen (d. H. In einem Browser eingegeben).

+0

, die nur funktioniert, wenn die 'einzigartige' Phrase unangreifbar ist. Wenn aus einer Textdatei gelesen wird, ist dies unmöglich. wenn aus dem Browser gelesen wird, ist jedes nicht druckbare Steuerzeichen wahrscheinlich in Ordnung. Tab funktioniert auch Wunder. in jedem Fall ist "aUniquePhraseToSaySplitMe" fast definitiv möglicherweise Teil der Eingabe und ist somit gefährlich. – muhmuhten

+0

Sie haben natürlich Recht. Mein Beispiel ist nur ein Beispiel mit dem Ziel zu erklären, was genau gemacht wird. Ich werde deinen Punkt in die Antwort selbst einbeziehen. Vielen Dank! –

+0

Wenn Sie str für Ihre einzigartige Phrase verwenden, wissen Sie, dass es nicht wieder da sein kann! : böser Grinsen –

7

Einzeiler und imo, einfacher:

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

Das gibt "ist Super | cool | ja!"

+0

Dies ist nicht, was gefragt wurde, sie suchen auch die fehlende erste Portion. – SmujMaiku

3

Wenn die Zeichenfolge das Trennzeichen @ nicht enthält, gibt NickCravers Lösung immer noch ein Array mit zwei Elementen zurück, das zweite ist eine leere Zeichenfolge. Ich ziehe es vor, dass das Verhalten dem von Split entspricht. Das heißt, wenn die Eingabezeichenfolge nicht das Trennzeichen enthält, geben Sie nur ein Array mit einem einzelnen Element zurück.

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

Das hier ist ein wenig länger, aber es funktioniert, wie ich glaube Grenze sollte:

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/

Grenze von Null lustige Ergebnisse zurückgibt, sondern im Namen der Effizienz, ich links den Scheck dafür aus. Sie können dies als die erste Zeile der Funktion hinzufügen, wenn Sie es benötigen:

if(limit < 1) return [];