Cách đếm số dòng của một chuỗi trong javascript


81

Tôi muốn đếm số dòng trong một chuỗi

tôi đã cố gắng sử dụng câu trả lời stackoverflow này:

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

trên chuỗi này (ban đầu là một bộ đệm):

 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

và vì lý do nào đó, tôi có dòng = '1'.

bất kỳ ý tưởng làm thế nào để làm cho nó hoạt động?


3
@BookOfZeus "\ n" và "\ r" do regexp của anh ấy xử lý. "\ n \ r" rõ ràng là sai.
bezmax 13/12/11

ồ tôi hiểu rồi, bạn nói đúng là tệ của tôi
Book Of Zeus

Tôi đã trả lời một câu hỏi liên quan, "Cách nhanh nhất để kiểm tra số lượng dòng hoặc mã thông báo tối thiểu là gì?" stackoverflow.com/questions/39554154/…
Joe Lapp

@bezmax "\ n \ r" là cần thiết cho văn bản đã dán.
Cá heo tối cao

@SupremeDolphin Không, ít nhất là không phải đối với ví dụ đã cho. Xem en.wikipedia.org/wiki/… : "Dòng yêu cầu và các trường tiêu đề khác phải kết thúc bằng <CR> <LF>", nghĩa là \r\n.
bezmax

Câu trả lời:


137

Sử dụng một biểu thức chính quy, bạn có thể đếm số dòng là

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

Ngoài ra, bạn có thể thử phương pháp tách như bên dưới.

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

giải pháp làm việc: http://jsfiddle.net/C8CaX/


2
Thất bại đối với trường hợp kiểm tra này: 'Roomy Below:\n\nStart again.'. Nó phát hiện 3 dòng, khi, bằng mắt thường, có 4. Điều này là do sự phân tách kết hợp cả hai dòng mới với nhau.
SimplGy

4
@SimplGy Cái gì? Nó không thất bại. Nó phát hiện 3 dòng vì có 3 dòng, thậm chí trực quan. console.log('Roomy Below:\n\nStart again.')cung cấp cho bạn 3 dòng. Nếu tách các dòng mới đã hợp nhất, điều này sẽ không hoạt động: console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n'))nhưng nó có và bạn nhận được 3 dòng giống nhau một lần nữa.
Jools

1
Bạn nói đúng Jools, tôi đã nhầm lẫn trường hợp tạo lại này bởi vì trực quan đó là 3 dòng (\ n đầu tiên kết thúc một dòng văn bản và dòng thứ hai tạo ra một dòng trống). Tôi chắc chắn rằng sự phản đối của tôi dựa trên một kịch bản đời thực vào một thời điểm nào đó nhưng tôi không biết điều gì vào thời điểm này.
SimplGy

4
Nếu văn bản của bạn chỉ mất '\ n' cho các ký tự xuống dòng (ví dụ như một <textarea>'s value), bạn có thể xem xét sử dụng TEXT.match(/^/mg).length.
Константин Ван

bạn trả lời là không chính xác, hãy xem xét trường hợp "\ n \ n". Chỉ có hai dòng. Nhưng mã của bạn xuất ra 3. Điều này không đúng.
Khamidulla

42

Một giải pháp ngắn gọn khác, có khả năng hoạt động hiệu quả hơn so với phân tách, là:

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

đây là cách giải pháp tốt hơn
asmmahmud

3
như giải pháp này, cải tiến nhỏ: \r?không thực sự làm bất cứ điều gì, (str.match(/\n/g) || '').lengthtạo ra cùng một kết quả, phải không?
Samuel Kirschner

Giải pháp tốt hơn, vì hàm phân tách tạo ra mảng mới nặng hơn giải pháp này.
hashed_name

cả hai phương thức đều tạo ra một mảng mới… str.match trả về một Mảng cũng vậy, quá trình phân tách cũng vậy… Phương thức phân tách trả về một Mảng các chuỗi, nhưng str.match trả về một Mảng các đối tượng. Tôi nghĩ rằng một đối tượng chiếm nhiều chỗ hơn trong bộ nhớ hơn so với chuỗi ...
Bruno Desprez

người chiến thắng rõ ràng trong tiêu chuẩn
Mila Nautikus

9

Để phân chia bằng cách sử dụng regex /.../

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

9

Hmm yeah ... những gì bạn đang làm là hoàn toàn sai. Khi bạn nói str.split("\r\n|\r|\n")nó sẽ cố gắng tìm ra chuỗi chính xác "\r\n|\r|\n". Đó là chỗ bạn sai. Không có sự xuất hiện như vậy trong toàn bộ chuỗi. Những gì bạn thực sự muốn là những gì David Hedlund đề xuất:

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

Lý do là phương pháp phân tách không chuyển đổi chuỗi thành biểu thức chính quy trong JavaScript. Nếu bạn muốn sử dụng regexp, hãy sử dụng regexp.


7

Tôi đã thực hiện một bài kiểm tra hiệu suất so sánh phân tách với regex, với một chuỗi và thực hiện với vòng lặp for.

Có vẻ như vòng lặp for là nhanh nhất.

LƯU Ý: mã 'nguyên trạng' này không hữu ích cho dòng cuối của windows cũng như macos, nhưng sẽ ổn khi so sánh hiệu suất.

Chia bằng chuỗi:

split('\n').length;

Chia bằng regex:

split(/\n/).length;

Chia nhỏ sử dụng cho:

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

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


buồn cười, điểm chuẩn của tôi nói rằng vòng lặp chậm nhất
Mila Nautikus

3

Có ba lựa chọn:

Sử dụng jQuery (tải xuống từ trang web jQuery ) - jquery.com

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

Sử dụng Regex

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

Hoặc, một bản tái tạo cho mỗi vòng lặp

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

1

Đây là fiddle mẫu làm việc

Chỉ cần xóa bổ sung \ r \ n và "|" từ người yêu cũ đăng ký của bạn.


0

Giải pháp tốt hơn, vì hàm str.split ("\ n") tạo một mảng chuỗi mới được chia bởi "\ n" nặng hơn str.match (/ \ n \ g). str.match (/ \ n \ g) chỉ tạo mảng các phần tử phù hợp. Đó là "\ n" trong trường hợp của chúng tôi.

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

0
 <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>

điều đó hoạt động trong trường hợp của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.