स्ट्रिंग से नई लाइन वर्ण कैसे निकालें?


181

मेरे पास निम्नलिखित प्रारूप में एक स्ट्रिंग है

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

मैं ऊपर की \nऔर \rस्ट्रिंग की सभी घटनाओं को दूर करना चाहता हूं ।

मैंने कोशिश की है, string s = s.Trim(new char[] {'\n', '\r'});लेकिन यह मदद नहीं की।

जवाबों:


321

मुझे नियमित अभिव्यक्ति का उपयोग करना पसंद है। इस मामले में आप कर सकते हैं:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

.NET दुनिया में नियमित अभिव्यक्ति उतनी लोकप्रिय नहीं हैं जितनी कि वे गतिशील भाषाओं में हैं, लेकिन वे तार को हेरफेर करने के लिए बहुत शक्ति प्रदान करते हैं।


यह निश्चित रूप से मेरे लिए सबसे अच्छा समाधान था। इस C # और जावास्क्रिप्ट का एक सहज मिश्रण मुझे अपने मुद्दे को हल करने के लिए आवश्यक था।
जो ब्रुन्सन

मुझे इसी तरह की समस्या थी जहाँ मुझे अपनी स्ट्रिंग से नई सुर्खियाँ निकालने की भी जरूरत थी। मैं इसे string.Replace के साथ करने की कोशिश की, काम नहीं किया। जब मैंने पैरामीटर के रूप में सटीक नियमित अभिव्यक्ति स्ट्रिंग के साथ Regex.Replace का उपयोग किया, तो यह काम किया। धन्यवाद।
instanceof

8
1M + आइटम को संसाधित करने वाले लूप में इसका उपयोग करते समय सावधान रहें। Regex सिर्फ String.Replace की तुलना में धीमी है
निक

कोड उदाहरण टैब \ t को भी हटाता है, जो कि प्रश्न में नहीं है।
माइकल फ्रीजिम

71

आप String.Replaceएक चरित्र को हटाने के लिए उपयोग करना चाहते हैं ।

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

ध्यान दें कि String.Trim(params char[] trimChars)केवल प्रमुख और अनुगामी वर्णों को trimCharsहटाए गए उदाहरण से हटा दिया जाता है।

आप एक विस्तार विधि बना सकते हैं, जो बहुत सारे अस्थायी तार बनाने के ऊपर की प्रदर्शन समस्याओं से बचाती है:

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

8
ध्यान दें कि यह दृष्टिकोण दो मध्यवर्ती स्ट्रिंग ऑब्जेक्ट्स बनाएगा। आपके स्ट्रिंग के आकार के आधार पर, इसके महत्वपूर्ण प्रदर्शन और मेमोरी खपत परिणाम हो सकते हैं।
2:01 बजे सीडी

40

मुझे पता है कि यह एक पुरानी पोस्ट है, हालांकि मैंने सोचा था कि मैं नई लाइन वर्णों को निकालने के लिए उपयोग की जाने वाली विधि साझा करूंगा।

s.Replace(Environment.NewLine, "");

संदर्भ:

MSDN String.Replace विधि और MSDN पर्यावरण। नई संपत्ति


मोनो समर्थन के लिए अच्छा
निक

1
क्रॉस-इनवायरमेंट (यानी विंडोज ऐप जो कि यूनिक्स सिस्टम के डेटा के साथ फीड है) एप्लिकेशन के कारण यह मुनाफे की तुलना में अधिक समस्याएं पैदा करेगा।
जैकब स्ज़ुक्लाविक्ज़

15

यदि गति और कम मेमोरी उपयोग महत्वपूर्ण हैं, तो कुछ इस तरह करें:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

हां, मैं इसके साथ (एक विस्तार विधि में) भी जाऊंगा। हमेशा StringBuilder का उपयोग करने के लिए अच्छा है। +1
RPM1984

4
"हमेशा स्ट्रिंगबुलस्टार का उपयोग करने के लिए अच्छा है" <मैं कोई समर्थक नहीं हूं, लेकिन यह कड़ाई से सच नहीं है। जेफ एटवुड का यह लेख स्ट्रिंग हेरफेर / कॉन्फैक्शन और अंत में, अनुकूलन में एक मजेदार अंतर्दृष्टि प्रदान करता है।
फिल कूपर


3

एक LINQ दृष्टिकोण:

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));

1
यह सामान्य अधिभार का उपयोग कर रहा है जो क्वेरी द्वारा लौटाए गए प्रत्येक पर string.Joinकॉल करेगा । बेहतर होगा कि कंस्ट्रक्टर को केवल क्वेरी परिणाम दें । ToStringcharstrings1 = new string(s.Where(....).ToArrary());
जुहेर

0

सही विकल्प वास्तव में इस बात पर निर्भर करता है कि इनपुट स्ट्रिंग कितनी बड़ी है और पेरफोर्स और मेमोरी की आवश्यकता क्या है, लेकिन मैं एक नियमित अभिव्यक्ति का उपयोग करूंगा जैसे

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

या अगर हमें एक ही प्रतिस्थापन को कई बार लागू करने की आवश्यकता है, तो रेगेक्स जैसे संकलित संस्करण का उपयोग करना बेहतर है

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

नोट: विभिन्न परिदृश्यों को सर्वश्रेष्ठ प्रदर्शन और न्यूनतम मेमोरी खपत प्राप्त करने के लिए अलग-अलग तरीकों की आवश्यकता होती है


0

खैर ... मैं चाहूंगा कि आप अंतरिक्ष के अधिक विशिष्ट क्षेत्रों को समझें। \tवास्तव में एक क्षैतिज स्थान के रूप में है, न कि एक ऊर्ध्वाधर स्थान। ( \tनोटपैड में डालने का परीक्षण )

यदि आप जावा का उपयोग करते हैं, तो बस उपयोग करें \v। नीचे संदर्भ देखें।

\h - एक क्षैतिज व्हाट्सएप चरित्र:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - एक ऊर्ध्वाधर व्हाट्सएप चरित्र:

[\n\x0B\f\r\x85\u2028\u2029]

लेकिन मुझे पता है कि आप .NET का उपयोग करते हैं। तो हर ऊर्ध्वाधर जगह की जगह मेरा जवाब है ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

यह कुछ अन्य प्रश्न के उत्तर की तरह दिखता है ... और वास्तविक संदर्भ भी नहीं है ...
अलेक्सी लेवेनकोव

-4

Trimयदि आप प्रारंभ और समाप्ति से हटाना चाहते हैं, तो आप उपयोग कर सकते हैं ।

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

FYI करें,

ट्रिम () पहले से ही ऐसा करता है।

निम्नलिखित LINQPad नमूना:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

आउटपुट:

23
18

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