[java] Java에서 따옴표를 이스케이프하지 않고 문자열 리터럴을 작성하는 방법이 있습니까?

내부에 따옴표가 많은 문자열 리터럴이 있다고 가정합니다. 당신은 그들 모두를 피할 수 있지만 고통스럽고 읽기가 어렵습니다.

일부 언어에서는 다음과 같이 할 수 있습니다.

foo = '"Hello, World"';

자바 그러나, ''사용되는 char당신이 그것을 사용할 수 있도록의 String이런 식의. 일부 언어에는이 문제를 해결할 수있는 구문이 있습니다. 예를 들어, 파이썬에서는 다음과 같이 할 수 있습니다.

"""A pretty "convenient" string"""

Java에도 비슷한 것이 있습니까?



답변

대답은 ‘아니요’이며 그 증거는 Java 언어 사양에 있습니다 .

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

보시다시피 a StringLiteral"이스케이프없이 특수 문자를 포함 할 수 없습니다.

참고 : 프로젝트 내부 에 Groovy 를 임베드 할 수 있습니다 . 이렇게하면 Java 구문이 확장되어 '''multi line string ''', ' "string with single quotes" '"string with ${variable}".


답변

아니요, 저는 Java에 다른 문자열 리터럴 구문이 없다는 사실에 항상 짜증이났습니다.

다음은 내가 가끔 사용한 트릭입니다.

String myString = "using `backticks` instead of quotes".replace('`', '"');

나는 주로 정적 필드에 대해서만 이와 같은 작업을 수행합니다. 정적이기 때문에 문자열 교체 코드는 클래스 초기화시 한 번 호출됩니다. 따라서 런타임 성능 불이익은 거의 존재하지 않으며 코드를 훨씬 더 읽기 쉽게 만듭니다.


답변

2018 년 12 월 업데이트 (12 개월 후) :

원시 문자열 리터럴 ( 호박색 목록에 있음 )은 JDK 12에 적용되지 않습니다 . 여기
에서 비판을 참조 하십시오 .


향후 버전의 Java (10 이상)가있을 수 있습니다.

2018 년 1 월의 JEPS 8196004 참조 : ( “JEP”는 “JDK 향상 프로그램”입니다. )

JEP 초안 : 원시 문자열 리터럴

Java 프로그래밍 언어에 새로운 종류의 리터럴 인 원시 문자열 리터럴을 추가합니다.
전통적인 문자열 리터럴과 마찬가지로 원시 문자열 리터럴은 String을 생성하지만 문자열 이스케이프를 해석하지 않으며 여러 줄의 소스 코드에 걸쳐있을 수 있습니다 .

그래서 대신 :

Runtime.getRuntime().exec("\"C:\\Program Files\\foo\" bar");
String html = "<html>\n"
              "    <body>\n" +
              "         <p>Hello World.</p>\n" +
              "    </body>\n" +
              "</html>\n";
System.out.println("this".matches("\\w\\w\\w\\w"));

다음을 입력 할 수 있습니다.

Runtime.getRuntime().exec(`"C:\Program Files\foo" bar"`);

String html = `<html>
                   <body>
                       <p>Hello World.</p>
                   </body>
               </html>
              `;

System.out.println("this".matches(`\w\w\w\w`));

산뜻한!

그러나 그것은 여전히 초안 일뿐입니다. 완성되어 다음 JDK로 만들기 전에 게시, 제출, 후보자 및 자금 지원이 필요합니다.


답변

간단한 대답 : 아니요.

이스케이프해야하는 긴 문자열의 경우 일반적으로 외부 리소스에서 읽습니다.


답변

Apache Commons에서 StringEscapeUtils 를 사용할 수도 있습니다.

업데이트 : 누군가가 몇 가지 예에 관심이 있다면 유용한 링크가 있습니다 .https : //dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils


답변

다음은 나를 위해 작동하는 것 같습니다.

String x = "Some Text" + '"' + "More Text" + '"' + "Even More Text";

나는 char이 String, Strings 및 chars의 기본 변수 유형이기 때문에 결합 될 수 있다고 생각합니다 (적어도 이클립스 컴파일러는 불평하지 않는 것 같습니다).


답변

이스케이프 '하거나 "문자열에서 다음 코드를 사용할 수 있습니다.

String text = ...

text = text.replaceAll("('|\")", "\\\\$1");