न्यूलाइन ('\ n') द्वारा स्ट्रिंग को विभाजित करने के लिए नोड में कैसे?


135

न्यूलाइन ('\ n') द्वारा स्ट्रिंग को विभाजित करने के लिए नोड में कैसे? मेरे पास सरल स्ट्रिंग है var a = "test.js\nagain.js"और मुझे प्राप्त करने की आवश्यकता है ["test.js", "again.js"]। मैंने कोशिश की

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

लेकिन ऊपर से कोई भी काम नहीं करता है।



7
split()मूल स्ट्रिंग को संशोधित नहीं करता है।
thgaskell

यह एक शुद्ध जावास्क्रिप्ट प्रश्न की तरह लगता है, नोड.जेएस टैग की आवश्यकता नहीं होती है।
व्येक

जवाबों:


238

/\r?\n/Windows और UNIX दोनों प्रणालियों द्वारा प्रयोग करने योग्य होने की तरह एक regex पर विभाजन का प्रयास करें ।

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

3
क्लासिक मैक के बारे में क्या? ;)
एशलेफ

10
स्टीव जॉब्स के साथ क्लासिक मैक की मृत्यु हो गई ... दुख :(
ymz

43
\ n, \ r और \ r \ n को पकड़ने के लिए:split(/[\r\n]+/)
Julian TF

2
MacOSX अब एकल \ r का उपयोग नहीं करते हैं, यह केवल पुराने Macs के लिए था। मुझे लगता है कि वे अन्य यूनिक्स के समान ही हैं।
जकुबिक

12
/ [\ r \ n] + / खाली लाइनों को फ़िल्टर करेगा
Spongman

49

यदि फ़ाइल आपके सिस्टम का मूल है (निश्चित रूप से उस की कोई गारंटी नहीं है), तो नोड आपकी मदद कर सकता है:

var os = require('os');

a.split(os.EOL);

यह आमतौर पर मंच पोर्टेबिलिटी के लिए नोड से आउटपुट स्ट्रिंग्स के निर्माण के लिए अधिक उपयोगी है।


5
हाँ, आपको आमतौर पर ऐसा नहीं करना चाहिए। आपको प्लेटफ़ॉर्म की परवाह किए बिना नए सिरे से पार्स करना चाहिए।
1j01

मैं इस बात पर प्रकाश डालता हूं कि यह विशेष रूप से आपके सिस्टम की मूल स्थिति के लिए बहुत पहले वाक्य में है। यह अज्ञात या मिश्रित होने पर उपरोक्त उत्तर उपयुक्त है।
qubyte

सही। या जब यह अभी "ज्ञात" है, लेकिन भविष्य में बदल सकता है।
जे 01

केवल उस प्लेटफ़ॉर्म पर फ़ाइलें लोड करने पर काम करता है, जिस पर वे बनाए गए थे।
स्पॉन्जमैन

33

ऐसा लगता है कि रेगेक्स /\r\n|\r|\n/सीआर, एलएफ, और सीआरएलएफ लाइन एंडिंग्स, उनके मिश्रित अनुक्रमों को संभालता है, और सभी खाली लाइनों को इनबेटीइन रखता है। उसकी कोशिश करो!

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");

परिणामस्वरूप आपको ये सरणियाँ मिलनी चाहिए:

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

आप यह भी सिखा सकते हैं कि regex अन्य कानूनी यूनिकोड लाइन टर्मिनेटरों को जोड़कर |\xHHया |\uHHHHभागों को पहचानने के लिए , जहां Hअतिरिक्त टर्मिनेटर वर्ण कोडपॉइंट के हेक्साडेसिमल अंक हैं (जैसा कि विकिपीडिया लेख में देखा गया है U+HHHH)।


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

ध्यान दें कि splitमूल स्ट्रिंग को निर्दिष्ट करने के बजाय टिंग नया सरणी लौटाता है। आपको इसे एक चर में स्पष्ट रूप से संग्रहीत करने की आवश्यकता है।


17

एक समाधान जो सभी संभावित लाइन एंडिंग के साथ काम करता है जिसमें मिश्रित शामिल हैं और खाली लाइनों को रखने के साथ-साथ दो की जगह और एक विभाजन का उपयोग करके प्राप्त किया जा सकता है।

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

इसका परीक्षण करने के लिए कुछ कोड

  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/));

और आउटपुट

  // ----- 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
वास्तव में ब्लाकेवाटर द्वारा दिया गया समाधान: text.split (/ \ r \ n | \ n | \ r /); ऐसा ही करें और यह छोटा और तेज़ है
एलेजाद्रो ज़ालैबर्डर

7

पहला काम करना चाहिए:

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

4

मैंने नोड या ब्राउज़र में लाइन एंडिंग के साथ काम करने के लिए एक eolमॉड्यूल बनाया । इसकी एक विभाजित विधि है

var lines = eol.split(text)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.