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 ...
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 ...
Antworten:
Dies ist kein schöner Ansatz, funktioniert aber mit anständiger Effizienz:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
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)];
+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 .
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]
Pas de Pipe? C'est 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 ...
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", '|');
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"]
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).
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 [];
Wenn Sie eine "Pipeline" verwenden möchten, reduce
ist Ihr Freund
const 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 != ''))
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);
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.