Pesquisa de site

javascript - Dividir string na primeira ocorrência de espaço em branco


Eu não consegui um regex otimizado que dividisse uma String com base na primeira ocorrência de espaço em branco:

var str="72 tocirah sneab";

Eu preciso pegar:

[
    "72",
    "tocirah sneab",
]

Resposta #1

Se você se importa apenas com o caractere de espaço (e não com tabulações ou outros caracteres de espaço em branco) e se importa apenas com tudo antes do primeiro espaço e tudo depois do primeiro espaço, você pode fazer isso sem uma expressão regular assim:

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

Observe que se não houver nenhum espaço, então a primeira linha retornará uma string vazia e a segunda linha retornará a string inteira. Certifique-se de que esse é o comportamento desejado nessa situação (ou que essa situação não ocorrerá).

Resposta #2

O Javascript não suporta lookbehinds, então split não é possível. match funciona:

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

Outro truque:

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

que tal:

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

e por que não

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

ou talvez

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

Atualização 2019: a partir do ES2018, lookbehinds são suportados:

str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)

Resposta #3

No ES6 você também pode

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

Resposta #4

Atrasado no jogo, eu sei, mas parece haver uma maneira muito simples de fazer isso:

const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);

Isso deixará arr[0] com "72" e arr[1] com "tocirah sneab". Note que arr[2] estará vazio, mas você pode simplesmente ignorá-lo.

Para referência:

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

Resposta #5

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

mas eu ainda acho que há um jeito mais rápido, no entanto.

Resposta #6

A solução do Georg é boa, mas falha se a string não contiver nenhum espaço em branco. Se suas strings tiverem a chance de não conter espaços em branco, é mais seguro usar .split e grupos de captura assim:

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

Resposta #7

Não tenho certeza de por que todas as outras respostas são tão complicadas, quando você pode fazer tudo em uma linha, lidando também com a falta de espaço.

Como exemplo, vamos obter os primeiros e os componentes "restantes" de um nome:

const [first, rest] = 'John Von Doe'.split(/\s+(.*)/);
console.log({ first, rest });

// As array
const components = 'Surma'.split(/\s+(.*)/);
console.log(components);

Resposta #8

Você também pode usar .replace para substituir apenas a primeira ocorrência,

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

Deixando de fora o /g.

DEMO

Artigos relacionados