IT•개발 끄적/Java

[Java] 개행 문자열 치환 방법들 (String replace)

소다맛사탕 2022. 1. 8. 14:09
반응형

안녕하세요. 소다맛사탕 입니다.

오늘은 개행 문자열을 치환하는 방법들에 대해 알아 보겠습니다.

 

개행 문자 : new line character의 약어. 인자 또는 표시의 위치를 다음 행의 최초의 위치로 이동시키는 서식 제어 문자. 즉, 인자 위치나 표시 위치를 다음의 인자 행이나 표시 행의 최초의 장소로 이동시키기 위한 서식 제어 문자.

위와 같이 용어에 대한 설명은 알겠는데..., 개행 문자(?). 정확하게 뜻을 알아가며 쓰는 사람은 없을 겁니다.

 

개행 문자열을 치환해서 쓴다는 것은 바로 이런 경우 인데요.

 

프로젝트를 진행하다 보면 DB TABLE에 적재되어 있는 긴 문자열이 있습니다.

긴 문자열을 화면으로 노출시키게 되면 아래와 같은 오류가 발생하는데요.

Uncaught SyntaxError: Invalid or unexpected token

var str = '<div class="testClass">
		<p>테스트 입니다.</p>
		<button onclick="fncClickOpt();">클릭</button>
	</div>';

위와 같이 긴 문자열 데이터가 띄어쓰기 된 채로 표시됩니다. 그래서 스크립트가 제대로 작동하지 않는 경우가 발생합니다.

 

그래서 위와 같은 경우를 없애기 위해 서버단에서 문자열을 치환해야 합니다.


개행 문자 치환

String str = "";

str = " 안녕하세요.\r\n" + 
  " 저는 소다맛사탕 입니다.\r\n" + 
  " 반갑습니다.\r\n" + 
  " 이건 테스트 입니다.\r\n" + 
  " abcdefg\r\n" + 
  " 1234567";
  System.out.println("=======================01");
  System.out.println(str);

  str = str.replace("\r\n", "");
  System.out.println("=======================02");
  System.out.println(str);

  str = " 안녕하세요.\r\n" + 
  " 저는 소다맛사탕 입니다.\r\n" + 
  " 반갑습니다.\r\n" + 
  " 이건 테스트 입니다.\r\n" + 
  " abcdefg\r\n" + 
  " 1234567";

  str = str.replace(System.getProperty("line.separator"), "");
  System.out.println("=======================03");
  System.out.println(str);

  str = " 안녕하세요.\r\n" + 
  " 저는 소다맛사탕 입니다.\r\n" + 
  " 반갑습니다.\r\n" + 
  " 이건 테스트 입니다.\r\n" + 
  " abcdefg\r\n" + 
  " 1234567";

  str = StringUtils.normalizeSpace(str);
  System.out.println("=======================04");
  System.out.println(str);

1. 일반적인 치환

replace("\r\n", "")

String java.lang.String.replace(CharSequence arg0, CharSequence arg1)

데이터베이스를 통해 들어오는 개행 문자는 \r\n 형식으로 들어오므로

방법 : String.replace("\r\n", "");

 

2. Java System 제공

getProperty("line.separator")

String java.lang.System.getProperty(String key)

자바를 실행할 때 특정 시스템 프로퍼티를 가져올 수 있는데 그 중에 행 구분 문자

방법 : String.replace(System.getProperty("line.separator"), "");

 

3. Apache 제공 개행 문자열 치환

StringUtils.normalizeSpace

String org.apache.commons.lang3.StringUtils.normalizeSpace(String str)

MAVEN Repository : https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

WAS가 연결되어 있는 웹프로젝트 가정하에 쓸 수 있는 방법입니다.

강제적으로 개행 문자를 치환하므로 아주 강력하고 확실합니다.

방법 : StringUtils.normalizeSpace(String);

 

결론적으로, 

1번의 방법대표적인 방법이지만 간혹 개행 문자가 치환되지 않는 특수한 경우가 발생합니다.

2번의 방법은 OS 구분 관계 없이 모든 환경에서 개행 문자열을 치환할 수 있는 방법입지만 마찬가지로 개행 문자가 치환되지 않는 특수한 경우가 발생합니다..

3번의 방법줄 바꿈을 포함한 모든 공백을 단일 공백으로 정규화 하는 가장 강력하고 확실한 방법이지만, WAS가 연결되어 있는 환경과 더불어 프로젝트에 dependency를 선언해야 쓸 수 있습니다.

 

참조 : https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

 

StringUtils (Apache Commons Lang 3.12.0 API)

Splits a String by Character type as returned by java.lang.Character.getType(char). Groups of contiguous characters of the same type are returned as complete tokens, with the following exception: the character of type Character.UPPERCASE_LETTER, if any, im

commons.apache.org

https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

 

System Properties (The Java™ Tutorials > Essential Java Classes > The Platform Environment)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com