Düğümde dizeyi satırsonu ('\ n') ile bölmek nasıl?


136

Düğümde dizeyi satırsonu ('\ n') ile bölmek nasıl? Benim gibi basit bir ipim var var a = "test.js\nagain.js"ve almam gerekiyor ["test.js", "again.js"]. denedim

a.split("\n");
a.split("\\n");
a.split("\r\n");
a.split("\r");

ama yukarıdakilerin hiçbiri çalışmıyor.



7
split()orijinal dizeyi değiştirmez.
thgaskell

Bu, node.js etiketi gerektirmeyen saf bir JavaScript sorusuna benziyor.
Wyck

Yanıtlar:


239

/\r?\n/Hem Windows hem de UNIX sistemleri tarafından kullanılabilecek bir normal ifadeye ayırmayı deneyin .

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]

3
Peki ya klasik Mac'ler? ;)
AshleyF

10
klasik Mac'ler Steve Jobs ile birlikte öldü ... üzüntü :(
ymz

43
yakalamak için \ n, \ r ve \ r \ n:split(/[\r\n]+/)
Julian TF

2
MacOSX artık tekli kullanmıyor, bu sadece eski Mac'ler içindi. Diğer unix'lerle aynı \ nya sahip olduklarını düşünüyorum.
jcubic

12
/ [\ r \ n] + / boş satırları filtreleyecek
Spongman

49

Dosya sisteminize özgüse (kesinlikle bunun garantisi yoksa), Node size şu konularda yardımcı olabilir:

var os = require('os');

a.split(os.EOL);

Bu, genellikle platform taşınabilirliği için Node'dan çıktı dizeleri oluşturmak için daha kullanışlıdır .


5
Evet, genellikle bunu yapmamalısın. Platformdan bağımsız olarak yeni satırları ayrıştırmalısınız.
1j01

Bunun özellikle ilk cümlede sisteminize özgü dosyalar için olduğunu vurguluyorum. Yukarıdaki cevap, bunun bilinmediği veya karışık olduğu durumlar için uygundur.
qubyte

Sağ. Veya şimdi "bilindiğinde", ancak gelecekte değişebileceğinde.
1j01

yalnızca oluşturuldukları platformda dosya yüklerken çalışır.
Spongman

34

Normal ifade /\r\n|\r|\n/CR, LF ve CRLF satır sonlarını, bunların karışık dizilerini işliyor gibi görünüyor ve aradaki tüm boş satırları tutuyor. Bunu dene!

function splitLines(t) { return t.split(/\r\n|\r|\n/); }

// single newlines
splitLines("AAA\rBBB\nCCC\r\nDDD");
// double newlines
splitLines("EEE\r\rFFF\n\nGGG\r\n\r\nHHH");
// mixed sequences
splitLines("III\n\r\nJJJ\r\r\nKKK\r\n\nLLL\r\n\rMMM");

Sonuç olarak şu dizileri almalısınız:

[ "AAA", "BBB", "CCC", "DDD" ]
[ "EEE", "", "FFF", "", "GGG", "", "HHH" ]
[ "III", "", "JJJ", "", "KKK", "", "LLL", "", "MMM" ]

Ayrıca bu normal ifadeye , ek sonlandırıcı karakter kod noktasının onaltılık rakamları olan (Wikipedia makalesinde görüldüğü gibi ) ekleyerek veya parçalarla diğer okunaklı Unicode satır sonlandırıcılarını tanımayı öğretebilirsiniz .|\xHH|\uHHHHHU+HHHH


30
a = a.split("\n");

Not splitsadece orijinal dizeye atama yerine, ting yeni bir dizi döndürür. Açıkça bir değişkende saklamanız gerekir.


17

Karışık olanlar ve boş satırlar da dahil olmak üzere tüm olası satır sonlarıyla çalışan bir çözüm, aşağıdaki gibi iki değiştirme ve bir bölme kullanılarak elde edilebilir.

text.replace(/\r\n/g, "\r").replace(/\n/g, "\r").split(/\r/);

test etmek için bazı kodlar

  var CR = "\x0D";  //   \r
  var LF = "\x0A";  //   \n

  var mixedfile = "00" + CR + LF +            // 1 x win
                  "01" + LF +                 // 1 x linux
                  "02" + CR +                 // 1 x old mac
                  "03" + CR + CR +            // 2 x old mac
                  "05" + LF + LF +            // 2 x linux
                  "07" + CR + LF + CR + LF +  // 2 x win
                  "09";

  function showarr (desc, arr)
  {
     console.log ("// ----- " + desc);
     for (var ii in arr)
        console.log (ii + ") [" + arr[ii] +  "] (len = " + arr[ii].length + ")");
  }

  showarr ("using 2 replace + 1 split", 
           mixedfile.replace(/\r\n/g, "\r").replace(/\n/g, "\r").split(/\r/));

ve çıktı

  // ----- using 2 replace + 1 split
  0) [00] (len = 2)
  1) [01] (len = 2)
  2) [02] (len = 2)
  3) [03] (len = 2)
  4) [] (len = 0)
  5) [05] (len = 2)
  6) [] (len = 0)
  7) [07] (len = 2)
  8) [] (len = 0)
  9) [09] (len = 2)

1
Aslında blakkwater tarafından verilen çözüm: text.split (/ \ r \ n | \ n | \ r /); aynısını yapın ve daha kısa ve daha hızlı
Alejadro Xalabarder

7

İlki çalışmalı:

> "a\nb".split("\n");
[ 'a', 'b' ]
> var a = "test.js\nagain.js"
undefined
> a.split("\n");
[ 'test.js', 'again.js' ]

4

Düğüm veya tarayıcılarda satır sonlarıyla çalışmak için bir eolmodül yaptım . Bölünmüş bir yöntemi vardır.

var lines = eol.split(text)
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.