줄 바꿈으로 Java 문자열 분할


389

JTextArea정규식을 사용하여 문자열을 분할하여 텍스트를 분할하려고 \n하지만 작동하지 않으며 정규 표현식 \r\n|\r|n과 다른 많은 조합으로 시도했습니다 . 암호:

public void insertUpdate(DocumentEvent e) {
    String split[], docStr = null;
    Document textAreaDoc = (Document)e.getDocument();

    try {
        docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
    } catch (BadLocationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    split = docStr.split("\\n");
}

7
당신이 얻는 오류는 무엇입니까? "작동하지 않는다"는 말은 아무 의미가 없습니다. 오류 / 결과를 알려주세요. 이것이 코드 디버깅의 첫 번째 단계입니다. 잘못된 결과가 무엇인지, 그리고 프로그램이 어떻게 달성되었는지 파악하십시오.
Chii

당신은 정말로 무엇을하고 싶습니까? -JTextArea에 입력 된 줄 바꿈? -JTextArea가 줄 바꿈을 수행하는 위치를 찾으십니까? -???
user85421

답변:


732

이것은 당신을 커버해야합니다 :

String lines[] = string.split("\\r?\\n");

실제로 걱정해야 할 줄 바꿈은 두 가지뿐입니다 (UNIX 및 Windows).


43
JTextArea 문서는 '\ n'만 사용해야합니다. 뷰는 '\ r'을 완전히 무시합니다. 그러나 두 종류 이상의 구분 기호를 찾으려면 "\ r? \ n | \ r"세 가지를 모두 찾을 수 있습니다.
Alan Moore

10
Mac 9는 \ r을 사용합니다. OSX 10은 \ n
Raekye를

$ {fn : length (fn : split (data, '\\ r? \\ n'))}이 jstl에서 작동하지 않습니다

4
@antak yes, split기본적으로 분할 결과를 인식하면 후행 빈 문자열이 제거됩니다. 이 메커니즘을 끄려면 split(regex, limit)과 같은 음의 한계 가 있는 오버로드 된 버전을 사용해야 text.split("\\r?\\n", -1)합니다. 추가 정보 : Java 문자열 분할로 빈 값 제거
Pshemo

1
@stivlo의 의견은 잘못된 정보이며, 많은 찬사를받은 것은 유감입니다. @ Raekye가 지적했듯이 OS X (현재 macOS라고 함)는 2001 년에 출시 된 이후 \ n을 줄 구분 기호로 사용했습니다. Mac OS 9는 1999 년에 출시되었으며 Mac OS 9 이하의 컴퓨터는 본 적이 없습니다. 생산에서. \ r을 줄 구분자로 사용하는 단일 최신 운영 체제는 없습니다. a) 레트로 컴퓨팅을하지 않고, b) OS 9 머신을 사용하지 않고, c) 머신이 실제로 OS 9인지를 확실하게 판단 할 수없는 한, \ r을 Mac에서 줄 구분자로 사용할 코드를 작성하지 마십시오.
James McLaughlin

132

String#split​(String regex)방법은 정규식 (정규 표현식)을 사용하고 있습니다. Java 8 정규식은 \R( 패턴 클래스의 문서 에서)를 나타내는 것을 지원하기 때문에 :

줄 바꿈 매처
\ R 모든 유니 코드 줄 바꿈 시퀀스는 다음과 같습니다. \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

따라서 다음과 일치하도록 사용할 수 있습니다.

보시다시피 \r\n정규 표현식이 시작될 때 정규 표현식 이이 쌍을 먼저 일치 시키도록하고 일치가 실패하는 경우 단일 문자 줄 구분 기호 를 일치 시킵니다.


따라서 줄 구분 기호를 분할하려면을 사용하십시오 split("\\R").

당신이 경우 빈 문자열이 뒤에 배열 결과에서 제거하지 않으"" 사용 split(regex, limit)부정적인와 limit같은 매개 변수를 split("\\R", -1).

하나 이상을 처리하려면 빈 줄을 단일 구분 기호로 사용하십시오 split("\\R+").


4
예, 가장 좋은 대답입니다. 불행히도이 질문에 대한 질문은 6 년 전에 너무 일찍 제기되었습니다.
Dawood ibn Kareem

혼자서 \\R+다루지 않은 줄 끝 문자를 피하기 위해 에 분리했습니다 \\R.
SeverityOne

128

빈 줄을 원하지 않는 경우 :

String.split("[\\r\\n]+")

4
이중 백 슬래시는 불필요합니다. "백 슬래시, 이스케이프 및 인용"섹션을 참조하십시오 docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/…
angryITguy


1
위의 답변이없는 Mac OSX에서 작동했습니다.
John

이것은 또한 나를 위해 일했습니다. 탁월한 솔루션. 1) 나는 3시에 시계에 일어났다. \ r \ n \ r \ n2) 이것이 진짜 삶이다 \ r \ nso I
logixplayer

2
@tresf 대괄호 안에 수량자를 사용할 수 없습니다.
CX gamer

49
String.split(System.getProperty("line.separator"));

이것은 시스템 독립적이어야합니다


41
흥미로운 생각이지만 텍스트가 실제로 시스템의 줄 구분 기호를 사용하도록주의해야합니다. "Windows"구분 기호를 사용하는 유닉스 (예 : XML) 아래에 많은 텍스트 파일이 있고 유닉스 구분 기호를 사용하는 Windows에서는 꽤 많은 텍스트 파일이 있습니다.
Maarten Bodewes

안드로이드에서도 작동
ruX

6
Windows OS에서 작성되어 Unix OS로 전송 된 파일에는 여전히 \ r \ n 구분자가 포함됩니다. 안전한 게임을하고 두 분리기를 모두 고려하는 것이 좋습니다.
bvdb

17
이것은 매우 문제가있는 접근법입니다! 코드를 실행하는 시스템에서 파일이 생성되지 않았을 수 있습니다. 특정 시스템, 즉 런타임 시스템에 실제로 의존하는 이러한 종류의 "시스템 독립적"디자인을 강력히 권장하지 않습니다.
Martin

4
@Shervin 그것은 가장 좋은 방법은 아닙니다. 실제로 매우 나쁜 연습입니다. System.setProperty ( "line.separator", "넌 포인트가 없다"); 코드가 깨졌습니다. 당신이 모르는 의존성에 의해 비슷하게 호출 될 수도 있습니다.
Martin

14

수업에 새로운 방법 lines이 도입 String되었습니다을 반환 Stream<String>

이 문자열에서 추출 된 하위 문자열 스트림을 줄 종결 자로 분할하여 반환합니다.

인식 된 줄 종결자는 줄 바꿈 "\ n"(U + 000A), 캐리지 리턴 "\ r"(U + 000D) 및 캐리지 리턴 바로 다음에 줄 바꿈 "\ r \ n"(U + 000D U + 000A ).

다음은 몇 가지 예입니다.

jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
 ipusm
 sit

jshell> "lorem \n ipusm \r  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

jshell> "lorem \n ipusm \r\n  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

문자열 # 라인 ()


12

문자 그룹에서 이중 이스케이프 문자를 사용할 필요는 없습니다.

빈 줄이 아닌 모든 줄에 다음을 사용하십시오.

String.split("[\r\n]+")

예, 그렇습니다 어디에서든 이중 이스케이프가 필요한 경우 어디서나 필요합니다. 공백은 같은 탈출 \r\n하나 또는 두 개의 백 슬래시를 가질 수 있습니다; 그들은 어느 쪽이든 작동합니다.
Alan Moore

2
'\\'코드 의 이중 백 슬래시 는 '\'문자가 된 다음 RegEx 엔진으로 전달되므로 "[\\r\\n]"코드 [\r\n]에서 메모리가되고 RegEx가 처리합니다. Java가 정확히 RegEx를 처리하는 방법을 모르겠지만 "순수한"ASCII 문자열 패턴을 RegEx 엔진에 전달하고 이진 문자를 전달하는 대신 처리하도록하는 것이 좋습니다. 메모리에 "[\r\n]"(16 진수) 0D0A가되고 하나의 RegEx 엔진이 메모리를 수락하고 다른 RegEx 엔진은이를 받아 들일 수 있습니다. 결론은 그래서 정규식의 자바의 맛은 호환성을 위해 이중 슬래시를 유지, 그들을 필요로하지 않는 경우에도
nurchi

10

에서 클래스 A가 방법을 :JDK11Stringlines()

이 문자열에서 추출 된 행 스트림을 행 종결 자로 구분하여 리턴합니다.

또한 문서 는 다음과 같이 말합니다.

줄 종결자는 다음 중 하나입니다. 줄 바꿈 문자 "\ n"(U + 000A), 캐리지 리턴 문자 "\ r"(U + 000D) 또는 캐리지 리턴 바로 다음에 줄 바꿈 "\ r \ n "(U + 000D U + 000A). 줄은 0 개 이상의 문자 시퀀스 다음에 줄 종결자가 오거나 하나 이상의 문자 시퀀스 다음에 문자열 끝입니다. 라인은 라인 종결자를 포함하지 않습니다.

이것으로 간단하게 할 수 있습니다 :

Stream<String> stream = str.lines();

그런 다음 배열을 원한다면 :

String[] array = str.lines().toArray(String[]::new);

이 메소드는 가능한 병렬 옵션의 간결 하고 선언적인 표현 을 작성할 수 있으므로 많은 옵션을 통해 Stream을 반환 합니다.


7

아마도 이것이 효과가있을 것입니다 :

split 메소드의 매개 변수에서 이중 백 슬래시를 제거하십시오.

split = docStr.split("\n");

8
실제로는 아닙니다. Java 문자열 리터럴 형식으로 정규식을 작성할 때 "\ n"을 사용하여 정규식 컴파일러에 줄 바꿈 기호를 전달하거나 "\\ n"을 사용하여 줄 바꿈에 대한 이스케이프 시퀀스를 전달할 수 있습니다. Java 리터럴에서 지원되지 않는 \ v를 제외한 다른 모든 공백 이스케이프도 마찬가지입니다.
Alan Moore

3
@ 유발. 죄송합니다. 모든 "백 슬래시, 이스케이프 및 따옴표"가 필요하지 않습니다. docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/…
angryITguy

7

여기에 주어진 모든 답변은 실제로 BufferedReader # readline과 같이 줄 바꿈에 대한 Java 정의를 존중하지 않습니다. 자바 받고있다 \n, \r\r\n새로운 라인으로. 일부 답변은 여러 개의 빈 줄이나 형식이 잘못된 파일과 일치합니다. 예 : <sometext>\n\r\n<someothertext>사용 [\r\n]+하면 두 줄이 생깁니다.

String lines[] = string.split("(\r\n|\r|\n)", -1);

반대로 위의 답변에는 다음과 같은 속성이 있습니다.

  • 그것은 BufferedReader가 그것을 사용하는 것과 같은 새로운 줄의 Java 정의를 준수합니다.
  • 여러 줄 바꿈과 일치하지 않습니다
  • 빈 줄을 제거하지 않습니다.

6

어떤 이유로 든 String.split(예를 들어 정규 표현식으로 인해) 사용하지 않고 Java 8 이상에서 함수형 프로그래밍을 사용하려는 경우 :

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());

이것이 과잉 솔루션 일 수 있음을 알고 있습니다.
Danilo Piazzalunga

3
또는 String[] lines = new BufferedReader(...).lines().toArray(String[]::new);목록 대신 배열의 경우. 이 솔루션의 좋은 점은 BufferedReader모든 종류의 터미네이터 를 알고 있으므로 모든 종류의 형식으로 텍스트를 처리 할 수 ​​있다는 것입니다. (여기에 게시 된 대부분의 정규식 기반 솔루션은 이와 관련하여 부족합니다.)
Ted Hopp

2
이 솔루션은 Java 11부터 String.lines () 메소드가 도입 된 이후에는 사용되지 않습니다.
leventov

4

빈 줄이 끊어지지 않도록 보존하려면 :

String lines[] = String.split("\\r?\\n", -1);

3

위의 코드는 실제로 보이는 것을 수행하지 않습니다-단지 calcualtes 다음 계산을 덤프합니다. 사용한 코드입니까, 아니면이 질문에 대한 예입니까?

끝에 textAreaDoc.insertString (int, String, AttributeSet)을 시도해보십시오.


insertUpdate ()는 DocumentListener 메소드입니다. OP가 올바르게 사용한다고 가정하면 리스너 메소드 내에서 문서를 수정하려고하면 예외가 발생합니다. 그러나 당신 말이 맞습니다 : 그 질문의 코드는 실제로 아무것도하지 않습니다.
Alan Moore

2

이전 답변에 대한 대안으로 구아바 Splitter 줄 트리밍 또는 빈 줄 필터링과 같은 다른 작업을 결과 줄에 적용하려는 경우 API를 사용할 수 있습니다.

import com.google.common.base.Splitter;

Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

결과는 Iterable배열이 아니라 배열입니다.



1

주어진 모든 솔루션을 기반으로 시도가 실패한 후. 나는 \n특별한 단어로 바꾸고 나서 나눕니다. 나를 위해 다음과 같은 트릭을 수행했습니다.

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

질문에 주어진 예를 복제 할 수 없었습니다. 그러나이 논리를 적용 할 수 있다고 생각합니다.


1

위의 답변은 Android에서 나를 위해 일한 Pshemo 응답 덕분에 Android에서 도움이되지 않았습니다 . Pshemo의 답변을 여기에 남겨 둘 것입니다 .

split("\\\\n")

0
  • 도움이 되었기를 바랍니다.

 String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();

try {
    docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

split = docStr.split("\n");

0

줄 바꿈을 설정하고 표시하는 세 가지 규칙 ( 실제로 표준 이라고 할 수 있음)이 있습니다 .

  • carriage return + line feed
  • line feed
  • carriage return

일부 텍스트 편집기에서는 서로를 교환 할 수 있습니다.

메모장 ++

가장 간단한 것은 정규화 line feed한 다음 분할하는 것입니다.

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);

0

마을에 새로운 소년이 있으므로 위의 모든 복잡성을 처리 할 필요가 없습니다. JDK 11부터는 한 줄의 코드로 작성하면 줄을 나누고 Stream of String을 반환합니다.

public class MyClass {
public static void main(String args[]) {
   Stream<String> lines="foo \n bar \n baz".lines();
   //Do whatever you want to do with lines
}}

일부 참고 문헌. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -jdk-11의 기능 및 apis /

나는 이것이 누군가에게 도움이되기를 바랍니다. 행복한 코딩.


-1
package in.javadomain;

public class JavaSplit {

    public static void main(String[] args) {
        String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
        System.out.println("Before split:\n");
        System.out.println(input);

        String[] inputSplitNewLine = input.split("\\n");
        System.out.println("\n After split:\n");
        for(int i=0; i<inputSplitNewLine.length; i++){
            System.out.println(inputSplitNewLine[i]);
        }
    }

}

이것은 다른 설명과 비교하여 더 설명이 많고 코드가 적습니다. 이 코드로 달성하고있는 것이 무엇인지, 왜 적절한 대답을하는지 설명해 주시겠습니까?
Makoto

2
이것은 파일을 줄로 나누는 것과는 아무런 관련이 없습니다. 답을 제거해보십시오.
Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.