Dividi la stringa una volta in javascript?

Come posso dividere una stringa solo una volta, cioè fare 1|Ceci n'est pas une pipe: | Oui 1|Ceci n'est pas une pipe: | Oui parse a: ["1", "Ceci n'est pas une pipe: | Oui"] ?

Il limite in split non sembra aiutare …

Questo non è un approccio carino, ma funziona con efficienza decente:

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

Ecco una rapida dimostrazione di ciò

String.indexOf('|') utilizzare String.indexOf('|') per ottenere l’indice della prima occorrenza di ‘|’.

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

Puoi usare:

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

La regex divide la stringa in due gruppi corrispondenti (parentesi), il testo che precede il primo | e il testo dopo. Quindi, shift il risultato per eliminare l’intera corrispondenza di stringa ( splits[0] ).

una fodera e imo, più semplice:

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

Questo restituisce “am super | cool | yea!”

Prova questo:

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

Se la stringa non contiene il delimitatore, la soluzione di NickCraver restituirà ancora un array di due elementi, mentre il secondo è una stringa vuota. Preferisco che il comportamento corrisponda a quello della divisione. Cioè, se la stringa di input non contiene il delimitatore restituisce solo una matrice con un singolo elemento.

 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("abcd", " "); // ["a", "bcd"] splitOnce("a", " "); // ["a"] 

Così male come la maggior parte delle risposte finora:

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

Un approccio alternativo e breve, oltre ai beni altrove, consiste nell’usare il limite di replace() a proprio vantaggio.

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

Come @sreservoir fa notare nei commenti, la frase univoca deve essere veramente unica – non può essere nella fonte su cui stai eseguendo questa suddivisione, altrimenti la stringa dividerà in più parti di quelle che vuoi. Un carattere non stampabile, come dice, può fare se stai eseguendo questo contro l’input dell’utente (cioè, digitato in un browser).

Questo è un po ‘più lungo, ma funziona come credo che il limite dovrebbe:

 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/

il limite di Zero restituisce risultati divertenti, ma in nome dell’efficienza, ho omesso il controllo per questo. Puoi aggiungerlo come prima riga della funzione se ti serve:

 if(limit < 1) return []; 

usa la funzionalità di espressione regolare javascript e prendi la prima espressione catturata.

il RE probabilmente sarebbe simile a /^([^|]*)\|/ .

in realtà, hai solo bisogno di /[^|]*/ se hai convalidato che la stringa è stata formattata in questo modo, a causa dell’avidità regex javascript.