Java 13 텍스트 블록 * WITHOUT * 개행


12

"""구분 기호가 있는 Java 13 멀티 라인 텍스트 블록 기능이 널리 알려지고 있습니다.

그러나 포함 된 줄 바꿈없이 전체 단락이 필요한 곳에서 반복적 인 요구가 있습니다.

즉, 다음 코드 스 니펫 :

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """"
System.out.println(paragraph);

예상대로 다음을 생성합니다.

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... 보통 매우 유용합니다. 그러나 제 경우에는 특히 큰 단락의 경우 이것을 생성해야합니다.

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... 그리고 나중에 텍스트 흐름을 처리하십시오.)

트리플 쿼트 기능에 "줄 바꾸기 없음"매개 변수를 설정하는 방법이 있습니까?


나중에 HTML 문서의 일부가되거나 크기 조정이 가능한 대화 상자로 유입되는 대량의 텍스트를 입력한다고 상상해보십시오. 나는 데이터의 많은 "라인"의 가치에 입력 할 않고"line" + "line" + "line" 등 및 EOL의 최대 표시하지 않고. 이러한 난잡함을 피하고 구문을 유지하기 어려운 것은 전적으로 뒤에 """있습니다.
alife

답변:


16

이 기능의 설계자는이 요구 사항도 실현했습니다 ( JEP368의 '새로운 이스케이프 시퀀스' 참조 ). 따라서 JDK 14에 대한 최신 초기 액세스 빌드를 사용하면 후행 \을 사용하여 줄 끝에서 새 줄을 벗어날 수 있습니다 .

public class Main {
    public static void main(String[] args) {
        String paragraph =
            """
            aaaa bbbb cccc \
            dddd eeee ffff \
            gggg hhhh iiii \
            """;
        System.out.println(paragraph);
    }
}

인쇄물:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14, 응? 들여 쓰기 연결이 어떻게 작동하는지 또는 모든 공백이 깨끗하게 지워지는지 궁금합니다.
alife

그러나 여전히 기존 문자열 입력을 수정해야합니다.이 경우 해당 줄 바꿈을 직접 제거하기에 충분할 수 있습니다.
Naman

3
흠, 먼저 그들이 그것을 언어 변경을 정당화 같은 중요한 기능을 그대로 포함 문자 텍스트 할 수있는 말은, 지금은 자신의 이스케이프 시퀀스를 얻을, 나는 놀라움에 있고, 어떤 장점은 퍼팅 끝났어 "aaaa bbbb cccc ", +"dddd eeee ffff "그리고 +"gggg hhhh iiii "각각, 뚜렷한 라인에서…
Holger

@Holger 기능이 2로 분할되었습니다. 텍스트 블록 (일명 여러 줄 문자열) 및 원시 문자열 리터럴 (즉, tbd 인 그대로 문자열)입니다. 이것은 단지 전자입니다. 와 같은 다른 이스케이프는 \n여전히 텍스트 블록에서 작동합니다.
Jorn Vernee

1
그러나 이제는 readString포함 된 리소스를 훨씬 쉽게 처리 할 수 ​​있습니다. 필자는 전체 단락을 소스 코드에 통합하고 싶지 않았으며 I / O 관련 내용 만 귀찮았습니다.
Holger

4

String.linesJava-11부터 도입 된 것을 다음과 같이 사용할 수 있습니다 .

String output = paragraph.lines().collect(Collectors.joining());

무료이며 그만한 가치가있는 두 가지 코드 블록을 JShell에서 실행 한 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


3
... 같은 않는String output = paragraph.replaceAll("[\n\r]", "");
홀거

그리고 솔루션의 비 (허용 JDK-14의 수정까지 \s에서 """블록) 제가 실제로 하드 (예 : 단락 사이 등, 등) 반환할까요 라인 EOL없는 라인을 혼용 할 수
인공 생명을

1

실제로 Java 13에서 좋은 대답을 찾는 것이 쉽지는 않지만 (아마도 불가능할 수도 있음) Jorn Vernee는 그의 대답에서 문제를 우아하게 해결했다고 생각합니다 (Java 14의 새로운 이스케이프 시퀀스는 수용 가능한 솔루션을 제공합니다).

여러 가지 우려 사항을 확장하려면 다음을 수행하십시오.

  • 홀거는 " '텍스트 블록'기능은 그다지 설득력이 없다"고 언급했다. 인공 문자열 연결을 수행하는 많은 "추악한"코드를 보았으므로이 기능이 분명히 문제를 해결 한다고 생각 합니다 . 다른 한편으로, 나는 이와 같은 기능이 남용의 여지가 많다는 것에 동의해야 한다 ( "지금 우리는 그것을 훌륭하게 할 수 있기 때문에 자바 코드에 많은 텍스트를 넣자!"-다음 요점 참조) ).
  • 원래 질문에는이 기능을 전혀 사용하지 않고 해당 내용을 리소스 파일로 외부화하는 조언을 제공하는 "큰 단락"이 언급되어 있습니다.
  • 명확성과 특정 측면에 대해서는 "독자에게는 분명하지 않으므로 분명하지 않은 의미의 구문이 있습니다". 그것은 부분적으로 정확하며, 현재 이용 가능한 자료가 그렇게 크지 않은 동안 약간의 독서와 실험이 필요합니다. 나는 이것을 찾았습니다 : 텍스트 블록 에 대한 프로그래머 안내서 , 많은 예제를 제공합니다. 또한 텍스트 블록에 대한 예제를 작성했습니다. TextBlocks.java- 잘하면 도움이 될 것입니다.

중재자에 대한 참고 사항 :이 답변이 잠재적으로 가이드 라인을 위반한다는 것을 알고 있습니다 (질문을 다루지 않고 다른 사용자의 의견에 답장합니다). 여전히 진행중인 주제에 대한 토론의 여지가 있어야한다고 생각합니다 ( 텍스트 블록이 '두 번째 미리보기'모드 임을 잊지 마십시오 ).


0

paragraph.replaceAll("\\n","") 당신을 위해 일을해야합니다.


Intellij는 줄의 끝에 이스케이프 문자를 사용하기 때문에 일종의 충돌 루프에 있습니다. 아마도 가장 좋은 것은 """ line line line """.replaceAll("\\n",""); 지금은 그것을 확인할 수 없다는 것입니다.
alife

나는 이것이 런타임에 처리되고 컴파일 타임이 아닌 (사소한) 문제가 있다고 가정하지만, 그것은 내 목적에 대한 요구 사항은 아닙니다.
alife

이 솔루션은 또한 \sJDK-14 의 능력에 도달 할 수 없습니다 . 줄 바꿈없이 여러 단락을 원하지만 그 사이에 줄 바꿈이 필요한 경우 어떻게해야합니까?
alife
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.