जावास्क्रिप्ट में एक स्ट्रिंग की लाइनों की संख्या की गणना कैसे करें


84

मैं एक स्ट्रिंग में लाइनों की संख्या गिनना चाहता हूं

मैं इस stackoverflow जवाब का उपयोग करने की कोशिश की:

lines = str.split("\r\n|\r|\n"); 
return  lines.length;

इस स्ट्रिंग पर (जो मूल रूप से एक बफर था):

 GET / HTTP/1.1
 Host: localhost:8888
 Connection: keep-alive
 Cache-Control: max-age=0
 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.2 (KHTML,like Gecko) Chrome/15.0.874.121 Safari/535.2
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

और किसी कारण से मुझे लाइनें मिल गईं = '1'।

किसी भी विचार यह कैसे काम करने के लिए?


3
@BookOfZeus "\ n" और "\ r" को उसके regexp द्वारा नियंत्रित किया जाता है। "n \ r" सादा गलत है।
bezmax

ओह, मैं इसे देख रहा हूं, आप सही हैं मेरी बुरी
बुक ऑफ ज़ीउस

मैंने एक संबंधित प्रश्न का उत्तर दिया है, "न्यूनतम संख्या में लाइनों या टोकन के लिए परीक्षण करने का सबसे तेज़ तरीका क्या है?" stackoverflow.com/questions/39554154/…
जो लेप

पेस्ट किए गए पाठ के लिए @bezmax "\ n \ r" आवश्यक है।
सुप्रीम डॉल्फिन

@SupremeDolphin नहीं, यह दिए गए उदाहरण के लिए कम से कम नहीं है। En.wikipedia.org/wiki/… देखें : "अनुरोध पंक्ति और अन्य शीर्ष लेख फ़ील्ड को प्रत्येक <CR> <LF>" के साथ समाप्त होना चाहिए, अर्थात \r\n
bemmax

जवाबों:


141

एक नियमित अभिव्यक्ति का उपयोग करके आप लाइनों की संख्या गिन सकते हैं

 str.split(/\r\n|\r|\n/).length

वैकल्पिक रूप से आप नीचे दिए गए तरीके से विभाजन की कोशिश कर सकते हैं।

var lines = $("#ptest").val().split("\n");  
alert(lines.length);

काम कर समाधान: http://jsfiddle.net/C8CaX/


2
इस परीक्षण के मामले में विफल रहता है 'Roomy Below:\n\nStart again.':। यह 3 लाइनों का पता लगाता है, जब, नेत्रहीन, 4 होते हैं। ऐसा इसलिए है क्योंकि विभाजन दोनों नई लाइनों को एक साथ मिला देता है।
सिंपलजी

4
@SimplGy क्या? यह विफल नहीं है। यह 3 लाइनों का पता लगाता है क्योंकि 3 लाइनें हैं, यहां तक ​​कि नेत्रहीन भी। console.log('Roomy Below:\n\nStart again.')आपको 3 पंक्तियाँ देता है। यदि नई लाइनों को मर्ज कर दिया जाए, तो यह काम नहीं करेगा: console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n'))लेकिन यह करता है और आपको फिर से वही 3 लाइनें मिलती हैं।
जूल

1
तुम सही हो, जोल, मैंने इस री-क्रिएशन केस को गड़बड़ कर दिया क्योंकि नेत्रहीन जो कि 3 लाइनें हैं (पहली \ n एक टेक्स्ट लाइन को समाप्त करती है और दूसरी एक खाली लाइन बनाती है)। मुझे यकीन है कि मेरी आपत्ति किसी बिंदु पर वास्तविक जीवन परिदृश्य पर आधारित थी, लेकिन मुझे इस बात का कोई पता नहीं है कि इस बिंदु पर क्या है।
सिंपलजी

4
यदि आपका पाठ केवल नए-पंक्ति वर्णों (जैसे <textarea>'s value) के लिए' \ n 'लेता है , तो आप उपयोग करने पर विचार कर सकते हैं TEXT.match(/^/mg).length
Константин Ван

आप जवाब गलत मानते हैं कि मामला "\ n \ n" है। केवल दो लाइनें हैं। लेकिन आपका कोड आउटपुट 3. जो सही नहीं है।
खमीदुल्ला

45

विभाजन की तुलना में एक और छोटा, संभावित रूप से अधिक प्रदर्शनकारी, समाधान है:

const lines = (str.match(/\n/g) || '').length + 1

यह बेहतर उपाय है
asmmahmud

3
इस समाधान की तरह, छोटे सुधार: \r?वास्तव में कुछ भी नहीं कर रहा है, (str.match(/\n/g) || '').lengthएक ही परिणाम पैदा करता है, है ना?
सैमुअल किर्श्नर

बेहतर समाधान, चूंकि स्प्लिट फ़ंक्शन नए सरणी बनाता है जो इस समाधान से भारी है।
hashed_name

दोनों विधियाँ एक नई व्यूह रचना करती हैं ... str.match एक Array लौटाती है इसलिए विभाजन भी होता है ... विभाजन विधि एक Array of strings लौटाती है, लेकिन str.match ऑब्जेक्ट्स का Array लौटाती है। मुझे लगता है कि एक वस्तु स्ट्रिंग की तुलना में स्मृति में अधिक जगह लेती है ...
ब्रूनो डेस्पेरज़



9

हम्म हाँ ... तुम क्या कर रहे हो बिल्कुल गलत है। जब आप कहते हैं कि str.split("\r\n|\r|\n")यह सटीक स्ट्रिंग खोजने की कोशिश करेगा "\r\n|\r|\n"। वहीं तुम गलत हो। पूरे स्ट्रिंग में इस तरह का कोई भयावहता नहीं है। डेविड हेदलुंड ने जो सुझाव दिया वह वास्तव में आप चाहते हैं:

lines = str.split(/\r\n|\r|\n/);
return lines.length;

इसका कारण यह है कि विभाजन विधि स्ट्रिंग्स को जावास्क्रिप्ट में नियमित अभिव्यक्तियों में परिवर्तित नहीं करती है। यदि आप एक regexp का उपयोग करना चाहते हैं, तो एक regexp का उपयोग करें।


7

मैं एक स्ट्रिंग के साथ regex के साथ विभाजन की तुलना में एक प्रदर्शन परीक्षण किया, और एक पाश के साथ कर रही है।

ऐसा लगता है कि लूप के लिए सबसे तेज़ है।

नोट: यह कोड 'जैसा है' खिड़कियों के लिए उपयोगी नहीं है और न ही मैकोस एंडलाइन, लेकिन प्रदर्शन की तुलना करने के लिए ठीक होना चाहिए।

स्ट्रिंग के साथ विभाजित करें:

split('\n').length;

रेगेक्स के साथ विभाजित करें:

split(/\n/).length;

इसके लिए विभाजित करें:

var length = 0;
for(var i = 0; i < sixteen.length; ++i)
  if(sixteen[i] == s)
    length++;

http://jsperf.com/counting-newlines/2


अजीब बात है, मेरा बेंचमार्क कहता है कि लूप सबसे धीमा है
मिला नॉटिकस

3

तीन विकल्प हैं:

JQuery का उपयोग करना ( jQuery की वेबसाइट से डाउनलोड करना ) - jquery.com

var lines = $("#ptest").val().split("\n");
return lines.length;

रेगेक्स का उपयोग करना

var lines = str.split(/\r\n|\r|\n/);
return lines.length;

या, प्रत्येक लूप के लिए एक मनोरंजन

var length = 0;
for(var i = 0; i < str.length; ++i){
    if(str[i] == '\n') {
        length++;
    }
}
return length;


1

बेहतर समाधान, जैसा कि str.split ("\ n") फ़ंक्शन "\ n" द्वारा विभाजित स्ट्रिंग्स का नया सरणी बनाता है, जो str.match (/ \ n \ g) से अधिक भारी है। str.match (/ \ n \ g) केवल मिलान तत्वों की सरणी बनाता है। जो हमारे मामले में "\ n" है।

var totalLines = (str.match(/\n/g) || '').length + 1;

1
 <script type="text/javascript">
      var multilinestr = `
        line 1
        line 2
        line 3
        line 4
        line 5
        line 6`;
      totallines = multilinestr.split("\n");
lines = str.split("\n"); 
console.log(lines.length);
</script>

Thats मेरे मामले में काम करता है

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