자바 스크립트에서 문자열의 줄 수를 계산하는 방법


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

오, 난 당신이 바로 내 나쁜, 볼
제우스의 예약

"최소한의 라인 또는 토큰 수를 테스트하는 가장 빠른 방법은 무엇입니까?"라는 관련 질문에 답했습니다. stackoverflow.com/questions/39554154/...
조 라플란드에게

붙여 넣은 텍스트에는 @bezmax "\ n \ r"이 필요합니다.
Supreme Dolphin

@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

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

1
당신이 맞습니다 Jools, 시각적으로 3 줄이기 때문에이 재생성 사례를 망쳤습니다 (첫 번째 \ n은 텍스트 줄을 끝내고 두 번째 줄은 빈 줄을 만듭니다). 나는 내 이의가 어느 시점에서 실제 시나리오를 기반으로했다고 확신하지만 지금은 무엇인지 모르겠다.
SimplGy

4
텍스트가 개행 문자 (예 : <textarea>'s value)에 '\ n '만 사용하는 경우 TEXT.match(/^/mg).length.
Константин Ван 2011

대답이 틀 렸습니다. 사례 "\ n \ n"을 고려하십시오. 두 줄만 있습니다. 그러나 코드는 3을 출력합니다. 맞지 않습니다.
Khamidulla

45

분할보다 더 짧고 성능이 더 좋은 또 다른 솔루션은 다음과 같습니다.

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

이것이 더 나은 해결책입니다
asmmahmud

3
이 솔루션과 같이 작은 개선 : \r?실제로 아무것도 (str.match(/\n/g) || '').length하지 않고 동일한 결과를 생성하지 않습니까?
Samuel Kirschner

분할 기능이이 솔루션보다 무거운 새 배열을 생성하므로 더 나은 솔루션입니다.
hashed_name

두 메서드 모두 새 배열을 생성합니다. str.match는 Array를 반환하므로 분할도 마찬가지입니다. split 메서드는 문자열의 배열을 반환하지만 str.match는 객체의 배열을 반환합니다. 나는 개체가 ... 문자열보다는 메모리에 더 많은 공간을 생각
브루노 Desprez



9

흠 예 ... 당신이하는 일은 완전히 잘못되었습니다. 당신이 말하면 str.split("\r\n|\r|\n")정확한 문자열을 찾으려고 할 것 "\r\n|\r|\n"입니다. 그것이 당신이 틀린 곳입니다. 전체 문자열에는 그러한 발생이 없습니다. 정말로 원하는 것은 David Hedlund가 제안한 것입니다.

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

그 이유는 split 메소드가 JavaScript에서 문자열을 정규 표현식으로 변환하지 않기 때문입니다. 정규식을 사용하려면 정규식을 사용하십시오.


7

나는 split과 정규식, 문자열을 비교하고 for 루프로 수행하는 성능 테스트를 수행했습니다.

for 루프가 가장 빠른 것 같습니다.

참고 :이 코드 '있는 그대로'는 Windows 나 macOS endline에 유용하지 않지만 성능을 비교하는 데는 괜찮습니다.

문자열로 분할 :

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


재미, 내 벤치 마크 에 대한 루프 느린 것을 말한다
밀라 Nautikus

3

세 가지 옵션이 있습니다.

jQuery 사용 ( jQuery 웹 사이트 에서 다운로드 )-jquery.com

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

Regex 사용

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

또는 for each 루프의 재현

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.