मैं एक स्ट्रिंग से डबल कोट्स की शुरुआत और अंत कैसे ट्रिम कर सकता हूं?


139

मैं एक स्ट्रिंग से एक शुरुआत और समाप्ति दोहरे उद्धरण (") को ट्रिम करना चाहूंगा।
मैं जावा में इसे कैसे प्राप्त कर सकता हूं? धन्यवाद!


1
क्या स्ट्रिंग पहले से ही इसके चारों ओर उद्धरण है या समस्या के भाग के लिए जाँच कर रही है?
माइकल मायर्स

जवाबों:


250

आप इसके लिए String#replaceAll()एक पैटर्न के साथ उपयोग कर सकते हैं ^\"|\"$

उदाहरण के लिए

string = string.replaceAll("^\"|\"$", "");

नियमित अभिव्यक्तियों के बारे में अधिक जानने के लिए, कृपया http:// अनियमित-expression.info पर देखें ।

उस ने कहा, यह थोड़ा बदबू आ रही है जैसे आप एक सीएसवी पार्सर का आविष्कार करने की कोशिश कर रहे हैं। यदि हां, तो मैं मौजूदा पुस्तकालयों जैसे कि ओपनसीएसवी के लिए चारों ओर देखने का सुझाव दूंगा


6
आपको नहीं लगता कि यह डबल स्ट्रिंग के सभी आवृत्तियों को खाली स्ट्रिंग के साथ बदल देगा, बल्कि पहले और अंतिम के बाद।
गुरुकुलकी

1
@ufk: यह एक जटिल रेगेक्स नहीं है। आप अन्यथा का एक समूह के साथ परेशानी कर सकते हैं String#indexOf(), String#substring(), तरीकों और इतने पर। यह केवल थोड़ा तेज है, लेकिन यह बहुत अधिक कोड है। @GK: उह, क्या आपने रेगेक्स को पढ़ा / समझा या फिर उसका परीक्षण किया?
बालुसक

11
@GK कैरेट खोजे गए स्ट्रिंग की शुरुआत का प्रतिनिधित्व करता है, और डॉलर का चिह्न इसके अंत का प्रतिनिधित्व करता है। यहाँ बैकस्लैश निम्नलिखित उद्धरण "बच" जाता है इसलिए इसे केवल एक चरित्र के रूप में माना जाता है। तो यह रेगेक्स कहता है, उद्धरण की सभी घटनाओं को प्रारंभ में बदलें, या खाली स्ट्रिंग के साथ अंत में उद्धरण करें। जैसा निवेदन किया गया है।
कार्ल मैनस्टर

2
@ चेतावनी: मुझे यकीन नहीं है कि इस समस्या को उसके वर्तमान रूप में समझने में समस्या कैसे है।
बालुस

8
यहाँ रेगेक्स टूट गया है ^\"|\"$:। |का अर्थ है "या"। यह ^\"या तो मैच होगा या \"$^मैच स्ट्रिंग की शुरुआत और स्ट्रिंग के $अंत मैच। ^\"इसका मतलब है कि स्ट्रिंग के शुरू में \"$एक उद्धरण और स्ट्रिंग के अंत में एक उद्धरण से मेल खाता है।
.बिज़मन

31

स्ट्रिंग से पहला वर्ण और अंतिम वर्ण निकालने के लिए, उपयोग करें:

myString = myString.substring(1, myString.length()-1);

18
इसके लिए केवल यह आवश्यक है कि उद्धरणों की गारंटी मौजूद होनी चाहिए । अगर कोई गारंटी नहीं है, तो आपको पहले इसकी जांच करनी होगी।
बालुसक

4
@ बालसैक: निश्चित रूप से। प्रश्न के मेरे पढ़ने से, ऐसा लगता है कि स्ट्रिंग पहले से ही इसके चारों ओर उद्धरण है।
माइकल मायर्स

.length एक संपत्ति नहीं एक कार्य है
मार्टिन

2
@Martin: .length सरणियों की एक संपत्ति है, लेकिन .length () स्ट्रिंग्स की एक विधि है।
माइकल मायर्स

@MichaelMyers: उफ़, माफ करना मैं मानसिक जावास्क्रिप्ट मोड में था। मेरी गलती।
मार्टिन

16

अपाचे के साथ भी StringUtils.strip():

 StringUtils.strip(null, *)          = null
 StringUtils.strip("", *)            = ""
 StringUtils.strip("abc", null)      = "abc"
 StringUtils.strip("  abc", null)    = "abc"
 StringUtils.strip("abc  ", null)    = "abc"
 StringUtils.strip(" abc ", null)    = "abc"
 StringUtils.strip("  abcyx", "xyz") = "  abc"

इसलिए,

final String SchrodingersQuotedString = "may or may not be quoted";
StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more

यह विधि मेरे उदाहरण में दिखाए गए उद्धृत और अयोग्य स्ट्रिंग्स दोनों के साथ काम करती है। केवल नकारात्मक पक्ष यह है कि यह कड़ाई से मिलान किए गए उद्धरणों के लिए नहीं लगेगा , केवल अग्रणी और अनुगामी उद्धरण वर्ण (जैसे। "partiallyऔर "fully"उद्धृत तारों के बीच कोई अंतर नहीं )।


13

यदि दोहरे उद्धरण केवल शुरुआत और अंत में मौजूद हैं, तो एक सरल कोड यह पूरी तरह से काम करेगा:

string = string.replace("\"", "");


13

यह एक स्ट्रिंग के शुरू और अंत से दोहरे उद्धरणों को छीनने का सबसे अच्छा तरीका है।

someString.replace (/(^")|("$)/g, '')

2
शायद एकल उद्धरणों को भी शामिल करें (/ (^ \ "| \ ') | (\" | \ "$) / जी," ");
बॉब

11

अमरूद का उपयोग करके आप अधिक सुरुचिपूर्ण ढंग से लिख सकते हैं CharMatcher.is('\"').trimFrom(mystring);


2
क्या केवल एकल चरित्र को ट्रिम करना संभव है? उदाहरण के लिए यदि मेरा स्ट्रिंग दो एकल उद्धरणों के साथ समाप्त होता है तब भी मैं चाहता हूं कि केवल एक ही उद्धरण छंटनी हो।
वत्सल mevada

10

सबसे पहले, हम यह देखने के लिए जाँच करते हैं कि क्या स्ट्रिंग दोगुनी है, और यदि ऐसा है, तो उन्हें हटा दें। आप सशर्त को छोड़ सकते हैं यदि वास्तव में आप जानते हैं कि यह डबल उद्धृत है।

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}

परिमाण के आदेशों के अनुसार यह सबसे अच्छा जवाब है और यह भी निर्दिष्ट करता है कि उद्धरणों की वैकल्पिक या उपस्थिति के बारे में क्या करना है।
entonio

6

Kotlin

कोटलिन में आप String.removeSurrounding (सीमांकक: चारसामान) का उपयोग कर सकते हैं

उदाहरण के लिए

string.removeSurrounding("\"")

इस स्ट्रिंग के प्रारंभ और अंत दोनों से दिए गए सीमांकक स्ट्रिंग को हटाता है यदि और केवल यदि यह शुरू होता है और सीमांकक के साथ समाप्त होता है । अन्यथा इस स्ट्रिंग को अपरिवर्तित लौटाता है।

स्रोत कोड इस तरह दिखता है:

public fun String.removeSurrounding(delimiter: CharSequence): String = removeSurrounding(delimiter, delimiter)

public fun String.removeSurrounding(prefix: CharSequence, suffix: CharSequence): String {
    if ((length >= prefix.length + suffix.length) && startsWith(prefix) && endsWith(suffix)) {
        return substring(prefix.length, length - suffix.length)
    }
    return this
}

सैकड़ों अन्य प्रोग्रामिंग भाषाएं हैं। आपने कोटलिन के लिए उत्तर क्यों प्रदान किया और दूसरों के लिए नहीं :-)?
निकोले.लप्तेव

1
अच्छा सवाल @ nicolay.laptev! :) मैं जावा लिखता था और मैं कोटलिन में स्थानांतरित हो गया हूं और जब से मैं एक एंड्रॉइड डेवलपर हूं, मैंने सोचा था कि उसी स्थिति में अन्य डेवलपर्स हो सकते हैं, इसलिए यह उनके लिए भी उपयोगी हो सकता है। इसके अलावा, जो removeSurrounding()विधि मैंने ऊपर साझा की है , वह मेरे लिए देखी गई जिसे किसी भी जावा डेवलपर द्वारा आसानी से समझा जा सकता है।
रयान अमरल

1
यह एकल उत्तर आपके मौजूदा जावा कोडबेस में कोटलिन को अपनाने के पूरे बिंदु को दर्शाता है!
किरिल ग्रोशकोव

3

नीचे दिया गया पैटर्न, जिसके साथ प्रयोग किया जाता है java.util.regex.Matcher, स्ट्रिंग के अंदर दोहरे उद्धरणों की घटनाओं को प्रभावित किए बिना दोहरे उद्धरणों के बीच किसी भी स्ट्रिंग से मेल खाएगा:

"[^\"][\\p{Print}]*[^\"]"

2

@ Brcolow का उत्तर थोड़ा संशोधित करना

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}

मुझे लगता है कि विधि तर्क को एनोटेट किया @NonNullजाना चाहिए और इसे शायद इसके Objects.requireNonNull(string)अंदर ऐसा कुछ होना चाहिए क्योंकि अगर कोई स्ट्रिपक्वाट्स (अशक्त) कह रहा है तो वे शायद गलती से ऐसा कर रहे हैं!
ब्रुक्लो

2

स्काला

s.stripPrefix("\"").stripSuffix("\"")

यह इस बात पर ध्यान दिए बिना काम करता है कि स्ट्रिंग के शुरू और / या अंत में उद्धरण नहीं हैं या नहीं।

संपादित करें: क्षमा करें, केवल स्काला


2

संपादित: बस एहसास हुआ कि मुझे यह निर्दिष्ट करना चाहिए कि यह तभी काम करता है जब दोनों मौजूद हों। अन्यथा स्ट्रिंग को उद्धृत नहीं माना जाता है। CSV फ़ाइलों के साथ काम करते समय ऐसा परिदृश्य मेरे लिए दिखाई दिया।

org.apache.commons.lang3.StringUtils.unwrap("\"abc\"", "\"")    = "abc"
org.apache.commons.lang3.StringUtils.unwrap("\"abc", "\"")    = "\"abc"
org.apache.commons.lang3.StringUtils.unwrap("abc\"", "\"")    = "abc\""

1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}

1
private static String removeQuotesFromStartAndEndOfString(String inputStr) {
    String result = inputStr;
    int firstQuote = inputStr.indexOf('\"');
    int lastQuote = result.lastIndexOf('\"');
    int strLength = inputStr.length();
    if (firstQuote == 0 && lastQuote == strLength - 1) {
        result = result.substring(1, strLength - 1);
    }
    return result;
}

1

जावा में एक स्ट्रिंग की शुरुआत और अंत से एक या एक से अधिक दोहरे उद्धरण हटाने के लिए, आपको एक रेगेक्स आधारित समाधान का उपयोग करने की आवश्यकता है:

String result = input_str.replaceAll("^\"+|\"+$", "");

यदि आपको एकल उद्धरण निकालने की आवश्यकता है:

String result = input_str.replaceAll("^[\"']+|[\"']+$", "");

नोट : यदि आपके स्ट्रिंग में "अंदर है, तो यह दृष्टिकोण समस्याएँ पैदा कर सकता है (उदाहरण "Name": "John"=> Name": "John)।

एक जावा डेमो यहां देखें :

String input_str = "\"'some string'\"";
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
System.out.println(result); // => some string

0

प्रत्येक दोहरे उद्धरण चिह्नों को अनुक्रमित करें और वहां एक खाली स्ट्रिंग डालें।


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