Dividi la stringa alla prima occorrenza dello spazio bianco


150

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",
]

1
Cosa intendi con "ottimizzato"? Ha deve essere un'espressione regolare?
Deestan,

Per favore, prenditi il ​​tempo necessario per scorrere verso il basso fino alla risposta di @ georg - bellissimo stackoverflow.com/a/10272828/93910
Sanjay Manohar

Risposte:


324

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à).


50

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
Junaid

30

In ES6 puoi anche

let [first, ...second] = str.split(" ")
second = second.join(" ")

2
Mi è piaciuto un po 'e funziona bene, ma per quanto riguarda le prestazioni è piuttosto male per la soluzione di "sottostringa" più votata. appena testato ed è circa 10 volte più lento.
Pootzko,

19

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:

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


Si noti che questo produce un ultimo elemento vuoto.
Benjamin Intal,

13
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ò.


11

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

9

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

str = str.replace(' ','<br />');

Tralasciando il / g.

DEMO


3
@DannyHerran .. No, non lo farà? Hai mai provato il codice? Non è presente alcun modificatore / g. Non è globale. Prova a testare il codice prima di pretendere di sapere cosa fa . Testato anche nei tre principali browser. Mi piacerebbe sapere perché pensi a quello che fai.
Dedalo,

È intelligente perché l'ho sempre considerato un difetto. Questa è la prima volta che vedo che questo viene sfruttato :)
Gogol

2

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


Come questo! Hai dei "contro"?
iglesiasedd

0

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à.


0

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.


0

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 });


-1

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;
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.