जावा में, क्या उद्धरण से बचने के बिना एक स्ट्रिंग शाब्दिक लिखने का एक तरीका है?


111

मान लें कि आपके पास एक स्ट्रिंग शाब्दिक है, जिसके अंदर बहुत सारे उद्धरण चिह्न हैं। आप उन सब से बच सकते हैं, लेकिन यह एक दर्द है, और पढ़ना मुश्किल है।

कुछ भाषाओं में, आप ऐसा कर सकते हैं:

foo = '"Hello, World"';

जावा में, हालांकि, एस के ''लिए उपयोग किया जाता है char, इसलिए आप इसे Stringइस तरह से उपयोग नहीं कर सकते । कुछ भाषाओं में इसके चारों ओर काम करने के लिए वाक्य रचना है। उदाहरण के लिए, अजगर में, आप यह कर सकते हैं:

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

क्या जावा में कुछ समान है?



यह उत्तर दिखाता है कि किस तरह मल्टी-लाइन से बच गए तार को एक्लिसपे में चिपकाना है।
जेफ एक्सल्रॉड

2
अद्यतन २०१ string: जावा के लिए कच्चे स्ट्रिंग शाब्दिक आ सकते हैं। नीचे मेरा जवाब देखें
वॉन सी

इम्पोर्ट System.out.println(mapperObj.writeValueAsString(mapperObj.readValue(str, Object.class)));
जैकसन ऑब्जेक्टमैपर

अद्यतन Q4 2018: कच्चे स्ट्रिंग शाब्दिक अभी नहीं आ रहे हैं । देखिये मेरा अपडेटेड जवाब
वॉन

जवाबों:


74

उत्तर नहीं है, और प्रमाण जावा भाषा विशिष्टता में रहता है :

  StringLiteral:
   "StringCharacters"

  StringCharacters:
   StringCharacter
   | StringCharacters StringCharacter

  StringCharacter:
   InputCharacter but not " or \
   | EscapeSequence

जैसा कि आप देख सकते हैं एक StringLiteralबस द्वारा बाध्य किया जा सकता है "और भागने के बिना विशेष चरित्र शामिल नहीं कर सकते हैं ..

एक साइड नोट: आप अपनी परियोजना के अंदर ग्रूवी को एम्बेड कर सकते हैं , यह जावा के सिंटैक्स का विस्तार करेगा जिससे आप उपयोग कर सकते हैं '''multi line string ''', ' "string with single quotes" 'और यह भी "string with ${variable}"


141

नहीं, और मैं हमेशा जावा में अलग-अलग स्ट्रिंग-शाब्दिक सिंटैक्स की कमी से नाराज हूं।

यहाँ एक ट्रिक है जिसका मैंने समय-समय पर उपयोग किया है:

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

मैं मुख्य रूप से केवल एक स्थिर क्षेत्र के लिए ऐसा कुछ करता हूं। चूंकि यह स्टैटिक-रिप्लेस्ड कोड है, जिसे क्लास के इनिशियलाइज़ेशन पर एक बार कॉल किया जाता है। तो रनटाइम प्रदर्शन दंड व्यावहारिक रूप से कोई भी नहीं है, और यह कोड को काफी अधिक सुगम बनाता है।


आपको प्रतिस्थापन का उपयोग करने की आवश्यकता नहीं होगी?
लैंडन कुह्न

10
@ landon9720 नहीं, .replace किसी वर्ण / वर्ण अनुक्रम की सभी घटनाओं को किसी अन्य वर्ण / वर्ण अनुक्रम के साथ बदल देता है। .replaceAll regex का उपयोग करता है।
abelito

जिज्ञासा से बाहर आप जानते हैं कि अगर संकलित करने पर जावा कंपाइलर इसे सरल करेगा?
ug_

2
नहीं, मुझे नहीं लगता कि संकलक इसे सरल करेगा। लेकिन यह वास्तव में कोई फर्क नहीं पड़ता। यह एक बहुत ही सस्ती कॉल है, और अगर मैं केवल स्टैटिक फाइनल स्ट्रिंग्स के लिए ऐसा करता हूं, तो क्लासलोडिंग के बाद लागत केवल एक बार खर्च होगी। कि मैं आमतौर पर अच्छे लग रहे कोड के लिए भुगतान करने के लिए तैयार हूँ एक मूल्य :)
benjismith

3
फिर myString में "\" का क्या?
एंडरसन

10

अपडेट दिसंबर 2018 (12 महीने बाद):

कच्चे तार के शाब्दिक (जो एम्बर सूची में हैं ) JDK 12. से नहीं बनेंगे। यहाँ
की आलोचनाएँ देखें ।


जावा (10 या अधिक) के भविष्य के संस्करण में हो सकता है।

जनवरी 2018 से JEPS 8196004 देखें : ( "JEP" "JDK एन्हांसमेंट प्रोग्राम" )

JEP ड्राफ्ट: रॉ स्ट्रिंग स्ट्रिंगर्स

जावा प्रोग्रामिंग भाषा में एक नए प्रकार का शाब्दिक, एक कच्चा स्ट्रिंग शाब्दिक जोड़ें।
पारंपरिक स्ट्रिंग शाब्दिक की तरह, एक कच्चा स्ट्रिंग शाब्दिक स्ट्रिंग का उत्पादन करता है, लेकिन स्ट्रिंग से बचने की व्याख्या नहीं करता है और स्रोत कोड की कई पंक्तियों को फैला सकता है

इसलिए इसके बजाय:

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 में बनाने और जमा करने के लिए पोस्ट, सबमिट, उम्मीदवार और वित्त पोषित करने की आवश्यकता होगी।


5

सरल उत्तर: नहीं।

लंबे समय तक तार से बच जाना चाहिए, मैं आमतौर पर उन्हें किसी बाहरी संसाधन से पढ़ता हूं।


4

आप Apache कॉमन्स से StringEscapeUtils का भी उपयोग कर सकते हैं

अद्यतन : यदि कोई व्यक्ति कुछ उदाहरणों में रुचि रखता है तो यहां एक उपयोगी लिंक है: https://dzone.com/articles/commons-lang-3-improved-and-powerful-StringEscapeUtils


2
क्या आप इस समस्या के लिए कैसे दृष्टांत पर आधारित एक उदाहरण संभवतः जोड़ सकते हैं?
बेंगट

3
इसे केवल एक और संसाधन का संदर्भ माना जाता है जो इस प्रश्न का उत्तर दे सकता है। कृपया प्रश्न से मेल खाने वाले उदाहरण के साथ लिंक किए गए पृष्ठ को सारांशित करने पर विचार करें।
बेंगट

मैंने एक नज़र डाली और यह नहीं सोचा कि वास्तव में इस सवाल का जवाब है या नहीं। स्थैतिक तरीकों के इनपुट Stringएस हैं, इसलिए आपके कोड में एक अच्छी तरह से स्वरूपित मान रखने का कोई तरीका नहीं है। मुमकिन है कि आप इन विधियों का उपयोग किसी फ़ाइल में पढ़ने के लिए कर सकते हैं String, लेकिन मुझे नहीं लगता कि यहाँ यह प्रश्न है।
टॉम हैरिसन

जुड़ा हुआ वर्ग (org.apache.commons.lang3.StringEscapeUtils) पदावनत किया गया है और साथ प्रतिस्थापित org.apache.commons.text.StringEscapeUtils
jcarter

-4

निम्नलिखित मेरे लिए काम करता है:

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

मुझे लगता है क्योंकि स्ट्रिंग स्ट्रिंग के लिए आदिम चर प्रकार है, स्ट्रिंग्स और चार्ट संयुक्त हो सकते हैं (कम से कम ग्रहण संकलक शिकायत नहीं करता है)।


1
मुझे लगता है कि क्योंकि स्ट्रिंग स्ट्रिंग के लिए आदिम चर प्रकार है - आपकी धारणा गलत है। उस मामले के लिए, यह एक अलग प्रकार के साथ भी काम करेगा, जैसे एक इंट, जैसे: स्ट्रिंग x = "कुछ पाठ" + 33 + "अधिक पाठ";
नजीब

-6

यदि आप बचना चाहते हैं 'या "अपनी स्ट्रिंग में, आप निम्न कोड का उपयोग कर सकते हैं:

String text = ...

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

स्रोत कोड में स्ट्रिंग शाब्दिक के बारे में पूछा गया प्रश्न। क्षमा करें दोबारा प्रयास कीजिये।
michaelb958 - GoFundMonica
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.