Split string pada kemunculan spasi putih pertama

149

Saya tidak mendapatkan regex yang dioptimalkan yang memisahkan saya dengan String yang mendasarkan pada kejadian ruang putih pertama:

var str="72 tocirah sneab";

Saya perlu mendapatkan:

[
    "72",
    "tocirah sneab",
]
Luca
sumber
1
Apa yang Anda maksud dengan "dioptimalkan"? Apakah harus menjadi regex?
Deestan
Silakan luangkan waktu untuk menggulir ke bawah ke jawaban @ georg - beautiful stackoverflow.com/a/10272828/93910
Sanjay Manohar

Jawaban:

323

Jika Anda hanya peduli dengan karakter spasi (dan bukan tab atau karakter spasi putih lainnya) dan hanya peduli tentang segala sesuatu sebelum spasi pertama dan semua setelah spasi pertama, Anda bisa melakukannya tanpa ekspresi reguler seperti ini:

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

Perhatikan bahwa jika tidak ada ruang sama sekali, maka baris pertama akan mengembalikan string kosong dan baris kedua akan mengembalikan seluruh string. Pastikan itu adalah perilaku yang Anda inginkan dalam situasi itu (atau bahwa situasi itu tidak akan muncul).

Trott
sumber
49

Javascript tidak mendukung tampilan, jadi splittidak mungkin. matchbekerja:

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

Trik lain:

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

bagaimana tentang:

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

dan kenapa tidak

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

atau mungkin

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

Pembaruan 2019 : pada ES2018, lookbehinds didukung:

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

georg
sumber
str.match(/^(\S+)\s(.*)/).slice(1) tidak akan bekerja untuk string yang tidak memiliki ruang
Junaid
30

Di ES6 Anda juga bisa

let [first, ...second] = str.split(" ")
second = second.join(" ")
pengguna1652176
sumber
2
Saya suka ini sedikit dan itu berfungsi dengan baik tetapi kinerja bijaksana itu sangat buruk untuk solusi "substring" yang paling upvoted. baru saja mengujinya dan sekitar 10x lebih lambat.
pootzko
18

Terlambat dalam permainan, saya tahu tetapi tampaknya ada cara yang sangat sederhana untuk melakukan ini:

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

Ini akan pergi arr[0]dengan "72"dan arr[1]dengan "tocirah sneab". Perhatikan bahwa arr [2] akan kosong, tetapi Anda bisa mengabaikannya.

Sebagai referensi:

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

Cliff Stanford
sumber
Perhatikan bahwa ini menghasilkan elemen kosong terakhir.
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"];

tapi saya masih berpikir ada cara yang lebih cepat.

Joseph
sumber
11

solusi georg bagus, tetapi rusak jika string tidak mengandung spasi. Jika string Anda memiliki kemungkinan tidak mengandung spasi, lebih aman untuk menggunakan .sit dan menangkap grup seperti ini:

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

Anda juga dapat menggunakan. Ganti hanya untuk mengganti kejadian pertama,

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

Meninggalkan / g.

DEMO

Daedalus
sumber
3
@DannyHerran .. Tidak itu tidak akan? Sudahkah Anda menguji kodenya? Tidak ada pengubah / g. Itu bukan global. Coba uji kode sebelum Anda mengaku tahu apa fungsinya . Diuji di tiga browser utama juga. Saya ingin tahu mengapa Anda memikirkan apa yang Anda lakukan.
Daedalus
Itu cerdas karena saya selalu menganggap ini sebagai cacat. Ini adalah pertama kalinya saya melihat ini dimanfaatkan :)
Gogol
2

Hanya membagi string menjadi array dan rekatkan bagian-bagian yang Anda butuhkan bersama. Pendekatan ini sangat fleksibel, ia bekerja dalam banyak situasi dan mudah dipikirkan. Plus Anda hanya perlu satu panggilan fungsi.

arr = str.split(' ');             // ["72", "tocirah", "sneab"]
strA = arr[0];                    // "72"
strB = arr[1] + ' ' + arr[2];     // "tocirah sneab"

Atau, jika Anda ingin memilih apa yang Anda butuhkan langsung dari string, Anda bisa melakukan sesuatu seperti ini:

strA = str.split(' ')[0];                    // "72";
strB = str.slice(strA.length + 1);           // "tocirah sneab"

Atau seperti ini:

strA = str.split(' ')[0];                    // "72";
strB = str.split(' ').splice(1).join(' ');   // "tocirah sneab"

Namun saya menyarankan contoh pertama.

Demo kerja: jsbin

Rotareti
sumber
Seperti ini! Punya "kontra"?
iglesiasedd
0

Setiap kali saya perlu mendapatkan kelas dari daftar kelas atau bagian dari nama atau id kelas, saya selalu menggunakan split () lalu mendapatkannya secara spesifik dengan indeks array atau, paling sering dalam kasus saya, pop () untuk mendapatkan elemen terakhir atau shift () untuk mendapatkan yang pertama.

Contoh ini mendapatkan kelas div "gallery_148 ui-sortable" dan mengembalikan id galeri 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 

Saya yakin itu bisa dipadatkan menjadi lebih sedikit baris tapi saya membiarkannya diperluas untuk dibaca.

acarito
sumber
0

Saya membutuhkan hasil yang sedikit berbeda.

Saya ingin kata pertama, dan apa yang terjadi setelahnya - bahkan jika itu kosong.

str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' '));
str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1);

jadi jika input yang onewordAnda dapatkan oneworddan ''.

Jika inputnya one word and some moreAnda dapatkan onedan word and some more.

Jim Richards
sumber
0

Saya tidak yakin mengapa semua jawaban lain begitu rumit, ketika Anda bisa melakukan semuanya dalam satu baris, menangani kekurangan ruang juga.

Sebagai contoh, mari kita dapatkan komponen pertama dan "lainnya" dari sebuah nama:

let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });

[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });

Dan Dascalescu
sumber
-1

Fungsi berikut akan selalu membagi kalimat menjadi 2 elemen. Elemen pertama hanya akan berisi kata pertama dan elemen kedua akan berisi semua kata lain (atau itu akan menjadi string kosong).

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;
}
Sjoerd Linders
sumber
Ini terlalu rumit .
Dan Dascalescu