Java에서 파일에서 줄 바꿈을 제거하는 방법은 무엇입니까?


258

Windows 및 Linux에서 작동하는 방식으로 Java에서 문자열의 모든 줄 바꿈을 바꾸려면 어떻게해야합니까 (예 : 캐리지 리턴 / 줄 바꿈 / 줄 바꿈 등의 OS 관련 문제 없음)?

시도했습니다 (readFileAsString은 텍스트 파일을 문자열로 읽는 함수입니다).

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

그러나 이것은 작동하지 않는 것 같습니다.

이것을 어떻게 할 수 있습니까?


모든 줄 바꿈을 제거 하시겠습니까? 아니면 표준 솔루션으로 균일화하고 싶습니까?
helios

4
모든 줄 바꿈을 삭제하려면 Windows 줄 바꿈이 \ r \ n이므로 모든 \ n과 \ r을 모두 제거하십시오.
helios

참고로, 동시 muti-linebreak를 단일 줄 바꿈으로 바꾸려면 myString.trim().replaceAll("[\n]{2,}", "\n") 단일 공간으로 바꾸거나 사용할 수 있습니다 myString.trim().replaceAll("[\n]{2,}", " ")
Sourav Chandra

답변:


435

다음 text의 결과 로 설정해야합니다 text.replace().

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

이것은 문자열이 변경 불가능하기 때문에 필요합니다. 호출 replace하면 원래 문자열이 변경되지 않고 변경된 새로운 문자열이 반환됩니다. 에 결과를 할당하지 않으면 text새 문자열이 손실되고 가비지 수집됩니다.

모든 환경에서 개행 문자열을 얻는 방법은 전화를 통해 사용할 수 있습니다 System.getProperty("line.separator").


1
+1, 맞습니다. 이유에 관해서 : String은 불변 입니다. 이 replace()메소드 원하는 결과를 반환 합니다. 또한 API 문서를 참조하십시오 : java.sun.com/javase/6/docs/api/java/lang/… 편집 : 아 당신은 이미 나중에 스스로 편집했습니다 :)
BalusC

75
아마도 text = text.replace("\r\n", " ").replace("\n", " ");더 나은 해결책 일 것입니다. 그렇지 않으면 단어가 단일 공간 교체없이 서로 "접착"됩니다.
Bart Kiers

9
또한 모든 OS에서 대괄호를 사용하여 줄 바꿈을 올바르게 일치시킬 수 있습니다..replaceAll("[\\r\\n]+", "")
Yeti

2
질문은 모든 발생을 대체 할 것을 text = text.replaceAll("\n", "").replaceAll("\r", "");
요구함에

2
@basZero replaceAll는 정규식을 replace취하고 리터럴 문자열을 취하며 모든 발생을 대체합니다.
Joonas Vali

220

다른 답변에서 언급했듯이 대상이 변경되지 않기 때문에 코드가 주로 작동 String.replace(...)하지 않습니다 String. ( replace실제로는 Java 문자열을 변경할 수 없습니다!) 실제로 String필요한 것은 문자가 변경되면 새 객체 를 만들어 반환하는 것 입니다. 그러나 코드는 그것을 버립니다 String...


가능한 해결책은 다음과 같습니다. 어떤 것이 가장 정확한지 정확히 무엇을 하려는지에 달려 있습니다.

// #1
text = text.replace("\n", "");

개행 문자를 모두 제거하기 만하면됩니다. 이것은 Windows 또는 Mac 회선 종료에 대응하지 않습니다.

// #2
text = text.replace(System.getProperty("line.separator"), "");

현재 플랫폼에 대한 모든 줄 종결자를 제거합니다. 이것은 Windows에서 UNIX 파일을 처리하려는 경우 또는 그 반대의 경우에는 대응하지 않습니다.

// #3
text = text.replaceAll("\\r|\\n", "");

모든 Windows, UNIX 또는 Mac 줄 종결자를 제거합니다. 그러나 입력 파일이 텍스트 인 경우 단어를 연결합니다. 예 :

Goodbye cruel
world.

된다

Goodbye cruelworld.

따라서 실제로 이것을하고 싶을 수도 있습니다.

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

각 줄 종결자를 공백으로 바꿉니다. Java 8부터는 다음을 수행 할 수도 있습니다.

// #5
text = text.replaceAll("\\R", " ");

여러 줄 구분 기호를 하나의 공백으로 바꾸려면 다음을 수행하십시오.

// #6
text = text.replaceAll("\\R+", " ");

1
이것은 탁월한 답변입니다. Java 8 예제에 대한 전문가. 도와 줘서 고마워!
HankNessip 's November

22

현재 OS에서 유효한 줄 종결자를 제거하려면 다음을 수행하십시오.

text = text.replaceAll(System.getProperty("line.separator"), "");

줄 구분 기호를 제거하려면 다음과 같이하십시오.

text = text.replaceAll("\\r|\\n", "");

또는 약간 더 장황하지만 정규식이 적습니다.

text = text.replaceAll("\\r", "").replaceAll("\\n", "");

2
Kaleb의 답변에 대한 의견에서 논의 된 것처럼 단어를 함께 붙이는 것을 피하기 위해 정규식 접근 방식을 수정할 수 있고 text.replaceAll("(\\r|\\n)+", " ")Java의 욕심이 기본값이라고 가정하면 줄 바꿈 문자의 각 시퀀스에 대해 단 하나의 공간 이있는 솔루션을 갖게됩니다 .
Jørn Schou-Rode

19

이 기능 은 줄 바꿈을 포함한 모든 공백을 단일 공백으로 정규화합니다. 원래 질문이 정확히 요구 한 것은 아니지만 많은 경우에 필요한 것을 정확하게 수행 할 가능성이 있습니다.

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

14

이것은 효율적인 것 같아요

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

붙여 넣는 동안 "\ n"문자를 잃지 말고 동일한 코드를 사용하십시오. 작동해야하기 때문입니다. 아마도 마지막에 마지막 세미콜론 (;)을 잊었 기 때문일 수 있습니다.
JSBach

11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

많이 검색 한 후 다른 모든 라인에서 실패하여 완벽하게 작동했습니다.



3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace는 새 문자열을 반환하고 Java의 문자열은 변경할 수 없습니다.


3

파일을로 읽을 수 있습니다 BufferedReader. 이 클래스는 입력을 개별 라인으로 나눌 수 있으며 원하는대로 조립할 수 있습니다. BufferedReader작동 방식 은 현재 플랫폼에 관계없이 Linux, Windows 및 MacOS 세계의 라인 엔딩 규칙을 자동으로 인식합니다.

그 후:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

참고 readLine()반환 된 문자열에서 줄 끝 포함되지 않습니다. 위의 코드는 줄의 마지막 단어와 다음 줄의 첫 단어를 함께 붙이지 않도록 공백을 추가합니다.


3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

oracle 웹 사이트에서 trim ()의 정의는 "앞뒤 공백이 생략 된 문자열의 복사본을 반환합니다."

이 문서에서는 줄 바꿈 문자 (앞뒤)도 제거 될 것이라고 언급하지 않았습니다.

한마디 String text = readFileAsString("textfile.txt").trim();로 당신을 위해 일할 것입니다. (Java 6으로 확인)


1

(Apache) StringUtils 가 아직 여기에서 다루지 않은 것이 이상합니다 .

.replace메소드를 사용하여 문자열에서 모든 줄 바꿈 (또는 그 문제에 대한 하위 문자열의 다른 발생)을 제거 할 수 있습니다

StringUtils.replace(myString, "\n", "");

이 줄은 모든 줄 바꾸기를 빈 문자열로 바꿉니다.

개행은 기술적으로 문자이기 때문에 선택적으로 문자를 .replaceChars대체 하는 방법을 사용할 수 있습니다

StringUtils.replaceChars(myString, '\n', '');

StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford

0

참고로 동시 muti-linebreak를 단일 줄 바꿈으로 바꾸려면 다음을 사용할 수 있습니다.

myString.trim().replaceAll("[\n]{2,}", "\n")

또는 단일 공간으로 교체

myString.trim().replaceAll("[\n]{2,}", " ")

0

Apache Commons IOUtils를 사용하여 행을 반복하고 각 행을 StringBuilder에 추가 할 수 있습니다. 그리고 InputStream을 닫는 것을 잊지 마십시오

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

0

일반적인 방법을 사용하여 모든 문자를 임의의 문자로 바꿀 수 있습니다.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}


-2

이것을 시도하십시오 :

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");

5
교체하면 \n\r\n이상 존재하지 않으며 \ n을 대체하고 \\ n이 있으면 대체되어 \ 만 남습니다.
Rob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.