Wie kann ich einen String nur einmal teilen, dh 1|Ceci n'est pas une pipe: | Oui
analysieren : ["1", "Ceci n'est pas une pipe: | Oui"]
.
Das Limit bei der Aufteilung scheint nicht zu helfen ...
javascript
split
Stavros Korokithakis
quelle
quelle
components.splice(0,2).slice(0,2)
Sie möchten verwenden
String.indexOf('|')
, um den Index des ersten Auftretens von '|' abzurufen.var i = s.indexOf('|'); var splits = [s.slice(0,i), s.slice(i+1)];
quelle
+1
dass dies eigentlich die Länge der Trennzeichenfolge sein sollte, wenn mehr als ein Zeichen vorhanden ist.var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Sie können verwenden:
var splits = str.match(/([^|]*)\|(.*)/); splits.shift();
Der reguläre Ausdruck teilt die Zeichenfolge in zwei übereinstimmende Gruppen (in Klammern) auf, wobei der Text vor dem ersten | steht und der Text danach. Dann haben wir
shift
das Ergebnis, um die gesamte Zeichenfolge match (splits[0]
) loszuwerden .quelle
ein Liner und imo, einfacher:
var str = 'I | am super | cool | yea!'; str.split('|').slice(1).join('|');
Dies gibt "bin super | cool | ja!"
quelle
Die ES6-Syntax ermöglicht einen anderen Ansatz:
function splitOnce(s, on) { [first, ...rest] = s.split(on) return [first, rest.length > 0? rest.join(on) : null] }
Dies behandelt auch die Möglichkeit, dass die Zeichenfolge keine hat,
|
indem sie null zurückgibt, anstatt eine leere Zeichenfolge, die expliziter ist.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]
Ich habe diese Antwort hauptsächlich hinzugefügt, damit ich ein Wortspiel auf das Pipe-Symbol machen kann, aber auch, um die es6-Syntax zu demonstrieren - es ist erstaunlich, wie viele Leute sie immer noch nicht verwenden ...
quelle
Versuche dies:
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", '|');
quelle
Wenn die Zeichenfolge nicht das Trennzeichen enthält, gibt die NickCraver-Lösung weiterhin ein Array mit zwei Elementen zurück, wobei das zweite eine leere Zeichenfolge ist. Ich bevorzuge das Verhalten von Split. Das heißt, wenn die Eingabezeichenfolge das Trennzeichen nicht enthält, wird nur ein Array mit einem einzelnen Element zurückgegeben.
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"]
quelle
Genauso böse wie die meisten bisherigen Antworten:
var splits = str.split('|'); splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
quelle
Ein alternativer, kurzer Ansatz besteht neben den anderen Waren darin, das
replace()
Limit 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 hervorhebt, muss die eindeutige Phrase wirklich eindeutig sein - sie darf nicht in der Quelle enthalten sein, über die Sie diese Aufteilung ausführen, oder Sie erhalten die Zeichenfolge in mehr Teile aufgeteilt, als Sie möchten. Ein nicht druckbares Zeichen kann, wie er sagt, funktionieren, wenn Sie dies gegen Benutzereingaben ausführen (dh in einem Browser eingeben).
quelle
Dies ist ein bisschen länger, aber es funktioniert so, wie ich glaube, dass die Grenze:
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 liefert lustige Ergebnisse, aber im Namen der Effizienz habe ich die Prüfung dafür weggelassen. Sie können dies als erste Zeile der Funktion hinzufügen, wenn Sie es benötigen:
if(limit < 1) return [];
quelle
Wenn Sie eine "Pipeline" verwenden möchten,
reduce
ist Ihr Freundconst separator = '|' jsonNode.split(separator) .reduce((previous, current, index) => { if (index < 2) previous.push(current) else previous[1] += `${separator}${current}` return previous }, []) .map((item: string) => (item.trim())) .filter((item: string) => (item != ''))
quelle
Effektivere Methode:
const str = "1|Ceci n'est pas une pipe: | Oui" const [head] = str.split('|', 1); const result = [head, str.substr(head.length + 1)] console.log(result);
quelle
Verwenden Sie die Funktion für reguläre Javascript-Ausdrücke und nehmen Sie den ersten erfassten Ausdruck.
Der RE würde wahrscheinlich so aussehen
/^([^|]*)\|/
.Eigentlich brauchen Sie nur,
/[^|]*/
wenn Sie überprüft haben, dass die Zeichenfolge aufgrund der Gier von Javascript-Regex so formatiert ist.quelle