Dividi la stringa sulla prima occorrenza di spazio bianco

Non ho ottenuto una regex ottimizzata che mi ha diviso una stringa basandomi sulla prima occorrenza di spazio bianco:

var str="72 tocirah sneab"; 

Ho bisogno di ottenere:

 72 tocirah sneab 

Se ti interessa solo il carattere dello spazio (e non le tabulazioni o altri caratteri di spazi bianchi) e ti preoccupi solo di tutto prima del primo spazio e di tutto dopo il primo spazio, puoi farlo senza un’espressione regolare come questa:

 str.substr(0,str.indexOf(' ')); // "72" str.substr(str.indexOf(' ')+1); // "tocirah sneab" 

Notare che se non c’è spazio, la prima riga restituirà una stringa vuota e la seconda riga restituirà l’intera stringa. Assicurati che sia il comportamento che vuoi in quella situazione (o che quella situazione non sorgerà).

Javascript non supporta lookbehinds, quindi split non è ansible. match funziona:

 str.match(/^(\S+)\s(.*)/).slice(1) 

Un altro trucco:

 str.replace(/\s+/, '\x01').split('\x01') 

che ne dite di:

 [str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')] 

e perchè no

 reverse = function (s) { return s.split('').reverse().join('') } reverse(str).split(/\s(?=\S+$)/).reverse().map(reverse) 

o forse

 re = /^\S+\s|.*/g; [].concat.call(re.exec(str), re.exec(str)) 

In ES6 puoi anche

 let [first, ...second] = str.split(" ") second = second.join(" ") 
 var arr = []; //new storage str = str.split(' '); //split by spaces arr.push(str.shift()); //add the number arr.push(str.join(' ')); //and the rest of the string //arr is now: ["72","tocirah sneab"]; 

ma penso ancora che ci sia un modo più veloce però.

Puoi anche utilizzare .replace per sostituire solo la prima occorrenza,

 ​str = str.replace(' ','
');

Lasciando fuori il / g.

DEMO

la soluzione di georg è bella, ma si rompe se la stringa non contiene spazi bianchi. Se le tue stringhe hanno la possibilità di non contenere spazi vuoti, è più sicuro usare .split e catturando gruppi in questo modo:

 str_1 = str.split(/\s(.+)/)[0]; //everything before the first space str_2 = str.split(/\s(.+)/)[1]; //everything after the first space 

In ritardo al gioco, lo so, ma sembra esserci un modo molto semplice per farlo:

 var str = "72 tocirah sneab"; var arr = str.split(/ (.*)/); 

Questo lascerà arr[0] con "72" e arr[1] con "tocirah sneab" .

Per riferimento:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#Capturing_parentheses

Basta dividere la stringa in un array e incollare le parti necessarie. Questo approccio è molto flessibile, funziona in molte situazioni ed è facile ragionare. Inoltre hai solo bisogno di una chiamata di funzione.

 arr = str.split(' '); // ["72", "tocirah", "sneab"] strA = arr[0]; // "72" strB = arr[1] + ' ' + arr[2]; // "tocirah sneab" 

In alternativa, se vuoi selezionare direttamente ciò che ti serve direttamente dalla stringa, puoi fare qualcosa del genere:

 strA = str.split(' ')[0]; // "72"; strB = str.slice(strA.length + 1); // "tocirah sneab" 

O in questo modo:

 strA = str.split(' ')[0]; // "72"; strB = str.split(' ').splice(1).join(' '); // "tocirah sneab" 

Comunque suggerisco il primo esempio.

Demo di lavoro: jsbin

Ogni volta che ho bisogno di ottenere una class da un elenco di classi o una parte di un nome di class o id, io uso sempre split (), quindi ottenerlo in modo specifico con l’indice dell’array o, più spesso nel mio caso, pop () per ottenere l’ultimo elemento o shift () per ottenere il primo.

Questo esempio ottiene le classi div “gallery_148 ui-sortable” e restituisce l’ID galleria 148.

 var galleryClass = $(this).parent().prop("class"); // = gallery_148 ui-sortable var galleryID = galleryClass.split(" ").shift(); // = gallery_148 galleryID = galleryID.split("_").pop(); // = 148 //or galleryID = galleryID.substring(8); // = 148 also, but less versatile 

Sono sicuro che potrebbe essere compattato in meno linee, ma l’ho lasciato ampliato per la leggibilità.

Avevo bisogno di un risultato leggermente diverso.

Volevo la prima parola, e quello che è venuto dopo – anche se era vuoto.

 str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' ')); str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1); 

quindi se l’input è oneword si ottiene oneword e '' .

Se l’input è one word and some more ne ottieni one e one word and some more .