Non ho ottenuto una regex ottimizzata che mi ha diviso una stringa basata sulla prima occorrenza di spazio bianco:
var str="72 tocirah sneab";
Ho bisogno di ottenere:
[
"72",
"tocirah sneab",
]
Non ho ottenuto una regex ottimizzata che mi ha diviso una stringa basata sulla prima occorrenza di spazio bianco:
var str="72 tocirah sneab";
Ho bisogno di ottenere:
[
"72",
"tocirah sneab",
]
Risposte:
Se ti interessa solo il carattere dello spazio (e non le schede o altri caratteri dello spazio) 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"
Nota 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 desideri in quella situazione (o che quella situazione non si presenterà).
Javascript non supporta lookbehinds, quindi splitnon è possibile. matchlavori:
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))
Aggiornamento 2019 : a partire da ES2018, sono supportati lookbehinds:
str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)
str.match(/^(\S+)\s(.*)/).slice(1) non funzionerà per una stringa che non ha spazio
In ES6 puoi anche
let [first, ...second] = str.split(" ")
second = second.join(" ")
A fine partita, lo so, ma sembra esserci un modo molto semplice per farlo:
const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);
Questo partirà arr[0]con "72"e arr[1]con "tocirah sneab". Nota che arr [2] sarà vuoto, ma puoi semplicemente ignorarlo.
Per riferimento:
La soluzione di georg è buona, ma si interrompe se la stringa non contiene spazi bianchi. Se le tue stringhe hanno la possibilità di non contenere spazi bianchi, è più sicuro usare .split e catturare 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
Puoi anche utilizzare .replace per sostituire solo la prima occorrenza,
str = str.replace(' ','<br />');
Tralasciando il / g.
Basta dividere la stringa in un array e incollare insieme 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 scegliere quello che ti serve direttamente dalla stringa, potresti fare qualcosa del genere:
strA = str.split(' ')[0]; // "72";
strB = str.slice(strA.length + 1); // "tocirah sneab"
O così:
strA = str.split(' ')[0]; // "72";
strB = str.split(' ').splice(1).join(' '); // "tocirah sneab"
Comunque suggerisco il primo esempio.
Demo funzionante: jsbin
Ogni volta che ho bisogno di ottenere una classe da un elenco di classi o una parte di un nome di classe o ID, uso sempre split () quindi lo ottengo specificamente con l'indice di array o, molto spesso nel mio caso, pop () per ottenere l'ultimo elemento o shift () per ottenere il primo.
Questo esempio ottiene le classi del div "gallery_148 ui-ordinabili" 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 righe ma l'ho lasciato espanso per leggibilità.
Avevo bisogno di un risultato leggermente diverso.
Volevo la prima parola e ciò che mai è successo 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'ingresso è onewordche si ottiene oneworde ''.
Se l'input è one word and some moreche si ottiene onee word and some more.
Non sono sicuro del motivo per cui tutte le altre risposte sono così complicate, quando puoi fare tutto in una riga, gestendo anche la mancanza di spazio.
Ad esempio, prendiamo il primo e "altri" componenti di un nome:
let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });
[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });
La seguente funzione divide sempre la frase in 2 elementi. Il primo elemento conterrà solo la prima parola e il secondo conterrà tutte le altre parole (o sarà una stringa vuota).
var arr1 = split_on_first_word("72 tocirah sneab"); // Result: ["72", "tocirah sneab"]
var arr2 = split_on_first_word(" 72 tocirah sneab "); // Result: ["72", "tocirah sneab"]
var arr3 = split_on_first_word("72"); // Result: ["72", ""]
var arr4 = split_on_first_word(""); // Result: ["", ""]
function split_on_first_word(str)
{
str = str.trim(); // Clean string by removing beginning and ending spaces.
var arr = [];
var pos = str.indexOf(' '); // Find position of first space
if ( pos === -1 ) {
// No space found
arr.push(str); // First word (or empty)
arr.push(''); // Empty (no next words)
} else {
// Split on first space
arr.push(str.substr(0,pos)); // First word
arr.push(str.substr(pos+1).trim()); // Next words
}
return arr;
}