javascript - Del streng ved den første forekomsten av mellomrom


Jeg fikk ikke en optimalisert regex som delte en streng basert på den første forekomsten av mellomrom:

var str="72 tocirah sneab";

Jeg trenger å få:

[
    "72",
    "tocirah sneab",
]

Svar #1

Hvis du kun bryr deg om mellomromstegnet (og ikke tabulatorer eller andre hvite tegn) og bare bryr deg om alt før det første mellomrommet og alt etter det første mellomrommet, kan du gjøre det uten et regulært uttrykk slik:

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

Merk at hvis det ikke er noe mellomrom i det hele tatt, vil den første linjen returnere en tom streng og den andre linjen vil returnere hele strengen. Sørg for at dette er den oppførselen du ønsker i den situasjonen (eller at den situasjonen ikke vil oppstå).

Svar #2

Javascript støtter ikke lookbehinds, så split er ikke mulig. match fungerer:

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

Et annet triks:

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

hva med:

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

og hvorfor ikke

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

eller kanskje

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

Oppdatering 2019: fra og med ES2018 støttes lookbehinds:

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

Svar #3

I ES6 kan du også

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

Svar #4

Sent ute i spillet, jeg vet, men det ser ut til å være en veldig enkel måte å gjøre dette på:

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

Dette vil la arr[0] ha "72" og arr[1] ha "tocirah sneab". Merk at arr[2] vil være tom, men du kan bare ignorere det.

Til referanse:

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

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

men jeg synes fortsatt det finnes en raskere måte.

Svar #6

Georgs løsning er fin, men den bryter hvis strengen ikke inneholder mellomrom. Hvis strengene dine kan mangle mellomrom, er det tryggere å bruke .split og fangstgrupper på denne måten:

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

Svar #7

Jeg er ikke sikker på hvorfor alle andre svar er så kompliserte, når du kan gjøre alt på én linje, og samtidig håndtere mangelen på plass.

Som et eksempel, la oss hente det første og «resten» av komponentene i et navn:

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

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

Svar #8

Du kan også bruke .replace for å bare erstatte den første forekomsten,

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

Utelate /g.

DEMO

Relaterte artikler