JavaScriptで文字列の行数を数える方法


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

そして、何らかの理由で私はlines = '1'を得ました。

それを機能させる方法はありますか?


3
@BookOfZeus "\ n"と "\ r"は彼の正規表現によって処理されます。「\ n \ r」は明らかに間違っています。
bezmax 2011

ああ、私はそれを見る、あなたは正しい私の悪い
ゼウスの本2011

関連する質問に答えました。「最小行数またはトークン数をテストするための最速の方法は何ですか?」stackoverflow.com/questions/39554154/...
ジョーのLapp

貼り付けたテキストには@bezmax "\ n \ r"が必要です。
最高ドルフィン

@SupremeDolphinいいえ、そうではありません。少なくとも、与えられた例ではそうではありません。en.wikipedia.org/wiki/…を参照してください:「リクエストラインと他のヘッダーフィールドはそれぞれ<CR> <LF>で終わる必要があります」、つまり\r\n
bezmax

回答:


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.'。視覚的に4つある場合、3つの行を検出します。これは、分割によって両方の新しい行がマージされるためです。
SimplGy 2014年

4
@SimplGyなに?失敗しません。視覚的にも3本あるので3本検出します。console.log('Roomy Below:\n\nStart again.')あなたに3行を与えます。分割マージされた新しい行の場合、これは機能しません:console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n'))が、機能し、同じ3行が再び表示されます。
Jools 2016

1
あなたは正しいJoolsです。視覚的には3行であるため、この再作成のケースを台無しにしました(最初の\ nはテキスト行を終了し、2番目の行は空白行を作成します)。私の異議はある時点で実際のシナリオに基づいていたと確信していますが、現時点では何が起こっているのかわかりません。
SimplGy 2016

4
テキストが改行文字(例:a <textarea>'s value)に対して '\ n'のみを取る場合は、の使用を検討できますTEXT.match(/^/mg).length
КонстантинВан

答えが正しくない場合は「\ n \ n」と考えてください。2行しかありません。しかし、あなたのコードは3を出力します。これは正しくありません。
Khamidulla

45

別の短い、潜在的に分割よりもパフォーマンスが高いソリューションは次のとおりです。

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

これは
はるかに

3
このソリューションのように、小さな改善\r?があります。実際には何も(str.match(/\n/g) || '').lengthしていないので、同じ結果が得られますね。
サミュエルキルシュナー2018年

分割関数はこのソリューションよりも重い新しい配列を作成するため、より良いソリューションです。
hashed_name

どちらのメソッドも新しい配列を作成します…str.matchは配列を返すので分割も返します…splitメソッドは文字列の配列を返しますが、str.matchはオブジェクトの配列を返します。オブジェクトは文字列よりもメモリ内のスペースを多く取ると思います…
BrunoDesprez19年



9

うーんええ...あなたがしていることは絶対に間違っています。あなたが言うとき、str.split("\r\n|\r|\n")それは正確な文字列を見つけようとします"\r\n|\r|\n"。それはあなたが間違っているところです。文字列全体でそのような発生はありません。あなたが本当に欲しいのは、DavidHedlundが提案したことです。

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

その理由は、splitメソッドがJavaScriptで文字列を正規表現に変換しないためです。正規表現を使用する場合は、正規表現を使用してください。


7

分割と正規表現、文字列を比較し、forループで実行するパフォーマンステストを行いました。

forループが最速のようです。

注:このコード「現状のまま」は、Windowsやmacosのエンドラインには役立ちませんが、パフォーマンスを比較することはできます。

文字列で分割:

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


おかしい、私のベンチマークはforループが最も遅いと言っています
MilaNautikus20年

3

3つのオプションがあります。

jQueryの使用(jQuery Webサイトからダウンロード)-jquery.com

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

正規表現の使用

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

または、foreachループの再作成

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


1

より良い解決策は、str.split( "\ n")関数が、str.match(/ \ n \ g)よりも重い "\ n"で分割された文字列の新しい配列を作成するためです。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>

それは私の場合はうまくいく

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.