문자열에서 모든 줄 바꿈을 제거하는 방법


440

텍스트 영역에 텍스트가 있고 .value 속성을 사용하여 읽습니다.

이제 Enter정규식으로 .replace를 사용하여 텍스트에서 모든 줄 바꿈 (누를 때 생성되는 문자)을 제거하고 싶습니다 .하지만 정규식에서 줄 바꿈을 어떻게 표시합니까?

그렇게 할 수 없다면 다른 방법이 있습니까?


답변:


501

이것은 아마도 FAQ 일 것입니다. 어쨌든 줄 바꿈 (더 나은 줄 바꿈)은 캐리지 리턴 ( \r이전 Mac의 경우 CR, ), 줄 바꿈 ( \nLinux의 경우 \r\nUnics의 경우 LF , ) 또는 CR 다음에 LF ( , WinDOS의 경우) 중 하나 일 수 있습니다. (다른 답변과 달리 이것은 문자 인코딩과 관련없습니다 .)

따라서 RegExp모든 변형과 일치 하는 가장 효율적인 리터럴은

/\r?\n|\r/

문자열의 모든 줄 바꿈을 일치 시키려면 전역 일치를 사용하십시오.

/\r?\n|\r/g

각기. 그런 다음 replace몇 가지 다른 답변에서 제안한대로 방법을 진행하십시오 . (줄 바꿈 문자를 제거 하지 않고 공백 문자와 같은 다른 공백 문자로 바꾸면 단어가 그대로 유지됩니다.)


16
완전성을 기하기 위해 유니 코드에는 네 가지 줄 바꾸기 문자가 있습니다. \u000a또는 \n, 줄 바꿈; \u000d또는 \r, 이는 캐리지 리턴입니다. \u2028라인 분리기; 및 \u2029단락 구분 기호입니다. 그러나 실제로는 게시 한 정규 표현식으로 충분합니다.
Mathias Bynens

4
@MathiasBynens Thanks, 그러나 U + 2028 및 U + 2029 는 HTML (4.01)에서 명시 적으로 줄 바꿈을 구성 하지 않습니다 . DOM 트리 및 텍스트 영역의 실제 값은 다음을 기준으로합니다. w3.org/TR/html4/struct/text.html #whitespace
PointedEars

5
@PointedEars 예, 그러나 텍스트 영역을 .value동적으로 설정할 때 HTML 직렬화가 발생하지 않습니다 (예 :) textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. 그러나 이것은 아마도 가장자리 케이스 일 것입니다. 대부분의 경우 정규 표현식으로 충분합니다.
Mathias Bynens

2
@MathiasBynens U + 2028 및 U + 2029는 HTML (4.01)에서 줄 바꿈을 구성하지 않기 때문에 해당 할당은 주요 DOM 구현 및 레이아웃 엔진을 사용하여 텍스트 영역에 두 줄을 표시 하지 않습니다 . 따라서 올바른 마음을 가진 사람은 처음에는 그러한 임무를 수행하지 않을 것입니다.
PointedEars

1
textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, "")와 같이 작동하려면 백 슬래시를 이스케이프 처리해야했습니다. 여전히 +1 주셔서 감사합니다
게 버킷에게

512

줄 바꿈을 찾는 방법은 운영 체제 인코딩에 따라 다릅니다. Windows는 \r\n그랬지만 Linux는 사용 \n하고 Apple은 사용합니다 \r.

JavaScript 줄 바꿈 에서 이것을 발견했습니다 .

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

모든 종류의 줄 바꿈을 제거해야합니다.


18
왜 별도의 데 \r\n \n \r 단지보다 더 나은를 /[\n\r]/g? 분명히 이것은 가능한 두 가지 옵션 세트에 대해 각 문자를 확인하기 때문에 필요한 것보다 느립니다.
사라 코딩

2
/ [\ n \ r] / g를 사용하여 node.js의 memcached에서 반환 된 데이터를 구문 분석 할 때 트릭을 수행했습니다. 고마워요 코딩! 대답의 옵션은 그것을 도살했습니다.
Kyle Coots

111

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

String.trim() 줄 바꿈을 포함하여 문자열의 시작과 끝에서 공백을 제거합니다.

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

다음은 바이올린 예제입니다 : http://jsfiddle.net/BLs8u/

노트! 문자열 중간의 줄 바꿈이나 공백이 아닌 문자열의 시작과 끝만 자릅니다.


34
문자열의 시작과 끝에서 줄 바꿈 만 제거합니다. OP는 모든 줄 바꿈을 제거하는 방법을 묻습니다.
Ian Walter

4
네, 옵션으로 추가하면됩니다.
RobW

1
문자열의 시작과 끝-내가 필요한 것을 위해 일했습니다. 감사!
Harlin

46

\n바꿈 및 \r캐리지 리턴을 위해 정규 표현식에서 사용할 수 있습니다 .

var str2 = str.replace(/\n|\r/g, "");

다른 운영 체제는 다양한 혼합물로, 다른 라인 엔딩을 사용 \n하고 \r. 이 정규식은 모두를 대체합니다.


나는 이것이 첫 번째 사건만을 대체 할 것이라고 생각한다
Sebas

5
/\n|\r/g더 효율적으로 작성 /[\n\r]/g되거나 심지어 /[\n\r]+/g입니다. 꼭 필요한 경우가 아니면 교대를 피하십시오.
PointedEars

이것이 불만 사항인지 확실하지 않습니다. 그것은 내가 말한 것을 수행합니다 : 그 16 진수 범위가 아닌 모든 것을 제거하십시오. 어떤 문자는 물론 문자 세트에 달려 있지만이 게시물은 ASCII에 관한 것입니다.
masi

22

CR 및 LF를 포함한 모든 제어 문자를 제거하려면 다음을 사용할 수 있습니다.

myString.replace(/[^\x20-\x7E]/gmi, "")

인쇄 할 수없는 모든 문자를 제거합니다. 이것은 모두 ASCII HEX 공간 내에 있지 않은 문자 0x20-0x7E입니다. 필요에 따라 HEX 범위를 자유롭게 수정하십시오.


2
또한 영어 이외의 언어에서 일부 국가 문자를 제거 할 것입니다.
smentek

21

가장 간단한 해결책은 다음과 같습니다.

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()/\s+/g정규 표현식이 변화하고 모든 그룹 전체 문자열에서 하나의 공간으로 화이트 스페이스 문자를 우리는 .trim()결과는 이전과 텍스트 후 모든 초과 화이트 스페이스를 제거합니다.

공백 문자로 간주됩니다 :
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


굉장하지만 변수를 다시 할당하는 작업을합니다.str = str.replace(/\s+/g, ' ').trim();
Fred K


15

줄 바꿈 문자를 제거하려면 다음을 사용하십시오.

yourString.replace(/\r?\n?/g, '')

그런 다음 문자열을 잘라서 앞뒤 공백을 제거 할 수 있습니다.

yourString.trim()

6

PointedEars가 제공하는 답변은 대부분의 사람들이 필요로하는 모든 것입니다. 그러나 Mathias Bynens의 답변에 따라 Wikipedia 여행을 갔고 https://en.wikipedia.org/wiki/Newline을 찾았습니다 .

다음은 위의 위키 페이지가이 답변 당시 "새 줄"로 간주하는 모든 것을 구현하는 드롭 인 기능입니다.

케이스에 맞지 않는 것이 있으면 제거하십시오. 또한 성능을 찾고 있다면 이것이 아닐 수도 있지만 어떤 경우에도 작업을 수행하는 빠른 도구의 경우 유용합니다.

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});

3
우선 JS를 사용하지 않는 사람들을 위해 \R"모든"줄 바꿈 인 "가장"RE 맛 지원 을 지원 합니다. 둘째-왜 간단하지 someString.replace(new RegExp(lineTerminators.join('|')), '');
않습니까

@ClasG, 당신은 좋은 지적을합니다. 필자가 이것을 작성할 때 내 생각 은 성능상의 이유로 문자열에 존재 replace()하는 lineTerminators것에 대해서만 실행하는 것이라고 생각 합니다.
futz.co 2016 년

5

정규 표현식의 줄 바꿈은 \ n이므로 스크립트는

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));

5

내 대답을 추가하고 있습니다. 위의 애드온입니다. 모든 / n 옵션을 시도했지만 작동하지 않았습니다. 텍스트가 이중 슬래시로 서버에서 나오는 것을 보았으므로 다음을 사용했습니다.

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');

5

이 기능을 아래에서 사용하고 쉽게 생활하십시오

가장 쉬운 방법은 정규식을 사용하여 문자열의 개행을 감지하고 바꾸는 것입니다. 이 경우 교체 할 문자열과 함께 replace 함수를 사용합니다.이 경우 빈 문자열입니다.

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

위 식에서 g와 m은 전역 및 여러 줄 플래그를위한 것입니다.


2

다음 코드를 시도하십시오. 모든 플랫폼에서 작동합니다.

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'

0

Mac에서는 \n정규 표현식을 사용 하여 줄 바꿈을 일치시킵니다. 따라서 코드는 string.replace(/\n/g, '')ps입니다. g 다음에 나오는 g는 첫 번째가 아니라 모두 일치한다는 의미입니다.

Windows에서는입니다 \r\n.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.