İlk beyaz boşluk oluşumunda bölünmüş dize


150

Bana ilk beyaz boşluk olayı temel alarak bir dize ayıran optimize bir regex alamadım:

var str="72 tocirah sneab";

Almam gerek:

[
    "72",
    "tocirah sneab",
]

1
"Optimize edilmiş" ile ne demek istiyorsun? O mu var regex olunur?
Deestan

Lütfen @ georg'ın cevabına ilerlemek için zaman ayırın - beautiful stackoverflow.com/a/10272828/93910
Sanjay Manohar

Yanıtlar:


324

Yalnızca boşluk karakterini (sekmeleri veya diğer boşluk karakterlerini değil) ve yalnızca ilk boşluktan önceki her şeyi ve ilk boşluktan sonraki her şeyi önemsiyorsanız, bunu aşağıdaki gibi normal bir ifade olmadan yapabilirsiniz:

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

Hiç boşluk yoksa, ilk satırın boş bir dize ve ikinci satırın da tüm dizeyi döndüreceğini unutmayın. Bu durumda istediğiniz davranışın (veya bu durumun ortaya çıkmayacağından) emin olun.


50

Javascript lookbehinds'i desteklemediğinden splitmümkün değildir. matchİşler:

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

Başka bir numara:

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

nasıl:

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

ve neden olmasın

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

ya da belki

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

2019 güncellemesi : ES2018'den itibaren, görünümler desteklenmektedir:

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


str.match(/^(\S+)\s(.*)/).slice(1) alanı olmayan bir dize için alışkanlık
Junaid

30

ES6'da şunları da yapabilirsiniz:

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

2
Bunu biraz beğendim ve gayet iyi çalışıyor ama performans açısından en üst düzey "alt dize" çözümü için oldukça kötü. Sadece test ettim ve yaklaşık 10 kat daha yavaş.
pootzko

19

Oyunun sonlarına doğru biliyorum, ama bunu yapmanın çok basit bir yolu var gibi görünüyor:

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

Bu bırakacaktır arr[0]ile "72"ve arr[1]ile"tocirah sneab" . Arr [2] 'nin boş olacağını unutmayın, ancak yok sayabilirsiniz.

Referans için:

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


Bunun son bir boş öğe oluşturduğunu unutmayın.
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"];

ama yine de daha hızlı bir yol olduğunu düşünüyorum.


11

georg'in çözümü güzel, ancak dize boşluk içermiyorsa kesiliyor. Dizelerinizin boşluk içermeme şansı varsa, .split ve bu gibi grupları yakalamak daha güvenlidir:

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

9

.Replace komutunu yalnızca ilk olayı değiştirmek için de kullanabilirsiniz,

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

/ G çıkışını bırakarak.

DEMO


3
@DannyHerran .. Hayır olmayacak mı? Kodu bile test ettiniz mi? / G değiştiricisi yoktur. Küresel değil. Ne yaptığını bilmek için önce kodu test etmeyi deneyin . Üç ana tarayıcıda da test edildi. Neden ne yaptığını düşündüğünü bilmek istiyorum.
Daedalus

Bu akıllı çünkü bunu her zaman bir kusur olarak gördüm. İlk kez görüyorum ki bu avantajdan yararlanılıyor :)
Gogol

2

Dizeyi bir diziye ayırın ve ihtiyacınız olan parçaları birbirine yapıştırın. Bu yaklaşım çok esnektir, birçok durumda işe yarar ve akıl yürütmesi kolaydır. Artı sadece bir işlev çağrısı gerekir.

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

Alternatif olarak, ihtiyacınız olan şeyi doğrudan dizeden almak istiyorsanız, bunun gibi bir şey yapabilirsiniz:

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

Veya bunun gibi:

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

Ancak ilk örneği öneririm.

Çalışma demosu: jsbin


Bunun gibi! "Eksileri" var mı?
iglesiasedd

0

Sınıflar listesinden veya sınıf adı veya kimliğinin bir bölümünden bir sınıf almam gerektiğinde, her zaman split () kullanın ve sonra dizi dizini ile özel olarak olsun veya çoğunlukla benim durumumda pop () almak için ilk öğeyi almak için son öğeyi veya shift () yöntemini kullanın.

Bu örnek div'in "gallery_148 ui-sortable" sınıflarını alır ve 148 galeri kimliğini döndürür.

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 

Eminim daha az çizgiye sıkıştırılabilir ama okunabilirlik için genişletilmiş olarak bıraktım.


0

Biraz farklı bir sonuca ihtiyacım vardı.

İlk kelimeyi ve bundan sonra ne geldiğini istedim - boş olsa bile.

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

böylece giriş onewordalırsanız onewordve ''.

Eğer giriş ise ve one word and some morealırsınız .oneword and some more


0

Diğer tüm cevapların neden bu kadar karmaşık olduğundan emin değilim, hepsini tek bir satırda yapabileceğinizde, alan eksikliğini de ele alabilirsiniz.

Örnek olarak, bir adın ilk ve "diğer" bileşenlerini alalım:

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

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


-1

Aşağıdaki işlev cümleyi her zaman 2 öğeye böler. İlk öğe yalnızca ilk sözcüğü ve ikinci öğe diğer tüm kelimeleri içerecektir (veya boş bir dize olacaktır).

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.