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
