मैं C # में स्ट्रिंग से अंतिम चार वर्ण कैसे प्राप्त करूं?


309

मान लीजिए कि मेरे पास एक स्ट्रिंग है:

"34234234d124"

मैं इस तार के अंतिम चार अक्षर प्राप्त करना चाहता हूं जो है "d124"। मैं उपयोग कर सकता हूं SubString, लेकिन इसे कोड की कुछ पंक्तियों की आवश्यकता है, जिसमें एक चर का नामकरण शामिल है।

क्या C # के साथ एक अभिव्यक्ति में यह परिणाम प्राप्त करना संभव है?


3
जब आप 4 से कम अक्षर हैं, तो आप क्या चाहते हैं?
एजेंट-

12
4 > mystring.length ? mystring : mystring.Substring(mystring.length -4);
जॉडरेल

3
पायथन में समाधान सरल है "hello world"[-4:]:। मुझे उम्मीद है कि C # का भविष्य का संस्करण इसे आसान बना देगा।
कर्नल पैनिक

@ColonelPanic, अब आप C # 8.0 के साथ कर सकते हैं: "hello world"[^4..]:-)
फ्रोड एवेन्सन

जवाबों:


407
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?

यदि आप सकारात्मक हैं कि आपकी स्ट्रिंग की लंबाई कम से कम 4 है, तो यह और भी कम है:

mystring.Substring(mystring.Length - 4);

13
इसके अलावा, अगर mystringयह 4 चार्ट से कम लंबा है तो यह विफल हो जाएगा ।
जॉर्ज डकेट

3
+1 क्योंकि मुझे लगता है कि तुम्हारा @ dtb
जॉर्ज डकेट

कोड की कुछ पंक्तियों को लेना (जिसे ओपी पहले से जानता था) और इसे एक पंक्ति में रटना वास्तव में एक अभिव्यक्ति के समान नहीं है।
बुह

1
मुझें यह पसंद है। सरल और सुरुचिपूर्ण और अधिकतम लेता है तो यदि आपका स्ट्रिंग 0 से कम है तो आपको सूचकांक अपवाद से बाहर नहीं निकलेगा।
ब्रेटिकस

+1 सरल और बिंदु तक, सभी आधारों को कवर करता है। स्टेकिया द्वारा प्रस्तावित विस्तार विधि भी अच्छी है, लेकिन यदि आप इसे केवल एक बार कर रहे हैं तो थोड़ा अधिक मार डालेंगे।
मोरवेल

205

आप एक एक्सटेंशन विधि का उपयोग कर सकते हैं :

public static class StringExtension
{
    public static string GetLast(this string source, int tail_length)
    {
       if(tail_length >= source.Length)
          return source;
       return source.Substring(source.Length - tail_length);
    }
}

और फिर कॉल करें:

string mystring = "34234234d124";
string res = mystring.GetLast(4);

11
मुझे यह पसंद है, लेकिन मैं शायद इसे लास्ट () कहूंगा। सब के बाद सबस्ट्रिंग () GetSubstring () नहीं है।
बुह

21
शायद इसे टेल () लाइनक एक्सटेंशन लास्ट () के साथ अंतिम झड़प के रूप में कहते हैं।
क्रेग कर्टिस

5
+1 करने के लिए इसे "1 पंक्ति से बहुत अधिक लंबा"। लाइन सेविंग के कारण बिना पढ़े कोड को देखना इतना कष्टप्रद है।
Fabio Milheiro

2
या इसे @RJ प्रोग्रामर के उत्तर के अनुसार VisualBasic के साथ संगतता के लिए राइट () कॉल करें (मैं सिर्फ एक फ़ंक्शन के लिए एक और असेंबली जोड़ना नहीं चाहता)।
क्रिसमस

3
मुझे यह समाधान पसंद है।
ल्यूक


45

ठीक है, तो मैं देख रहा हूं कि यह एक पुरानी पोस्ट है, लेकिन हम कोड को फिर से क्यों लिख रहे हैं जो पहले से ही फ्रेमवर्क में प्रदान किया गया है?

मैं आपको सुझाव दूंगा कि आप फ्रेमवर्क DLL "Microsoft.VisualBasic" का संदर्भ जोड़ें

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);

8
वीबी कार्यक्षमता का उपयोग करने के लिए एक समय का अच्छा उदाहरण
ब्रायन व्हाइट

3
मैं तुमसे प्यार करता हूँ। मेरे अधिकांश प्रोग्रामिंग अनुभव वीबी हैं, इसलिए यह पता लगाना कि मैं उन सभी कार्यों का उपयोग कर सकता हूं जिनसे मैं परिचित हूं
बेन स्ट्रोमबेक

6
मैं कभी भी यह पता नहीं लगा सकता हूं कि यदि MS.VB का उपयोग एक अच्छा विचार है - तो इसे VisualBasicनामस्थान में क्यों हिलाया जाता है ? TextFieldParserएक और उदाहरण है। इन उपयोगिताओं को वास्तव में अजीब क्यों माना जाता है?
रफिन

6
मुझे ऐसा लगता है कि यह स्वीकृत उत्तर होना चाहिए। पहिया का फिर से आविष्कार क्यों?
ज़ैक

2
@ बॉम्बोका: हमें आश्वासन दिया जा सकता है कि जब तक Microsoft Visual Basic का समर्थन करना जारी रखेगा, तब तक यह जारी रहेगा। यह 4.6 रिलीज में शामिल है और मुझे एमएस से स्पष्ट या निहित कुछ भी नहीं मिल रहा है कि वे एक विकास भाषा के रूप में VB.Net का समर्थन करने से रोकने की योजना बनाते हैं।
आरजे प्रोग्रामर

30
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)

26

सबस्ट्रिंग का उपयोग वास्तव में काफी छोटा और पठनीय है:

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"

17

यहां एक और विकल्प है जो बहुत खराब प्रदर्शन नहीं करना चाहिए (क्योंकि आस्थगित निष्पादन )

new string(mystring.Reverse().Take(4).Reverse().ToArray());

हालांकि उद्देश्य के लिए एक विस्तार विधि mystring.Last(4)स्पष्ट रूप से सबसे साफ समाधान है, भले ही थोड़ा और काम हो।


1
@BrianWhite लोग नए साल के बाद कर्कश हैं?
कोनराड विल्टर्स्टन

1
अच्छा समाधान है। मुझें यह पसंद है। लेकिन आप सही स्ट्रिंग प्राप्त करने के लिए अन्य रिवर्स को भूल गए। होना चाहिए: नया तार (मिस्ट्रीरिंग। कविता।) (टेक।) (4)। रिवर्स ()। ToArray ());
यूरी मोरालेस

आह हाँ, आप सही हैं - मेरे मानसिक संकलक ने ऐसा नहीं सोचा था। अफसोस की बात है कि यह और भी बदतर दिखाई देता है! :)
आंद्रे लुस

1
ToArray के कारण कोई स्थगित निष्पादन नहीं है

1
मुझे नहीं लगता है कि आप समझते हैं, @ BjörnAliGöransson, मेरी बात यह थी कि Reverse().Take(4).Reverse()प्रत्येक को पूरी स्ट्रिंग नहीं दी जाए, यह केवल अंतिम ToArrayकॉल पर होता है । अगर वहाँ ऐसा कुछ नहीं किया गया था जैसा कि आस्थगित निष्पादन, यह करने के लिए अनुवाद होगा Reverse().ToArray().Take(4).ToArray().Reverse().ToArray()। यह, निश्चित रूप से, उन एक्सटेंशनों को मान लिया गया है कि आस्थगित प्रकार - जो मैंने जांच नहीं किया था। स्ट्रिंग कंस्ट्रक्टर्स IEnumerable को स्वीकार नहीं करते हैं, इसलिए आपको उस बिंदु पर एक सरणी में इसे एन्यूमरेट करना होगा।
आंद्रे लुस

17

आप बस SubstringC # की विधि का उपयोग कर सकते हैं । पूर्व के लिए।

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);

यह 0000 परिणाम लौटाएगा।


7
यह 28 बार की तरह उत्तर दिया गया है और आपने इसे फिर से जोड़ा है? और केवल प्राप्त होने वाले के बजाय दो-मापदंडों-अधिभार का उपयोग क्यों करें startIndex?
एंड्रयू

वास्तव में मुझे जिस उत्तर की आवश्यकता थी। @ अमित कुमावत को साझा करने के लिए धन्यवाद।
डेरिल


7
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;

अच्छा लगा, लेकिन मुझे लगता है कि आपका मतलब =नहीं था =+
dotancohen

1
मिस्ट्रिंग.सबस्ट्रिंग (रहस्मयी लिग्मेंटिंग - ४, ४) जैसा है वैसा ही है: मिस्ट्रिंग।सुबस्ट्रिंग (रहस्यमयी.लॉगिंग - ४)
मो हॉवर्ड


6

पिछले कुछ उत्तरों की तुलना में, मुख्य अंतर यह है कि इनपुट स्ट्रिंग के होने पर कोड का यह टुकड़ा ध्यान में रखता है:

  1. शून्य
  2. अनुरोधित लंबाई की तुलना में लंबा या मेल खाता है
  3. अनुरोधित लंबाई की तुलना में कम।

यह रहा:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }

    public static string MyLast(this string str, int length)
    {
        if (str == null)
            return null;
        else if (str.Length >= length)
            return str.Substring(str.Length - length, length);
        else
            return str;
    }
}

4

परिभाषा:

public static string GetLast(string source, int last)
{
     return last >= source.Length ? source : source.Substring(source.Length - last);
}

उपयोग:

GetLast("string of", 2);

परिणाम:

का


3

यह किसी भी लंबाई स्ट्रिंग के लिए विफल नहीं होगा।

string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"

यह संभवतः हाथ में कार्य के लिए ओवरकिल है, लेकिन अगर अतिरिक्त सत्यापन करने की आवश्यकता है, तो संभवतः इसे नियमित अभिव्यक्ति में जोड़ा जा सकता है।

संपादित करें: मुझे लगता है कि यह regex अधिक कुशल होगा:

@".{4}\Z"

5
निश्चित रूप से ओवरकिल। मैं इसके लिए सरल स्ट्रिंग विधियों के साथ रहना चाहूंगा।
tsells

तीन अक्षरों के तर्क के साथ बुलाया जाने पर दूसरा संस्करण तीन अक्षर वाला स्ट्रिंग नहीं लौटाता है, इसलिए यह नकारात्मक लुकहेड का उपयोग करते हुए आपके पहले सरल संस्करण के बराबर नहीं है! :-)
avl_sweden

3

एक जेनेरिक का उपयोग करें Last<T>। यह IEnumerableस्ट्रिंग सहित किसी भी के साथ काम करेगा ।

public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
    int count = Math.Min(enumerable.Count(), nLastElements);
    for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
    {
        yield return enumerable.ElementAt(i);
    }
}

और स्ट्रिंग के लिए एक विशिष्ट:

public static string Right(this string str, int nLastElements)
{
    return new string(str.Last(nLastElements).ToArray());
}

1
वाह। Overkill। शायद enumerable.Skip (enumerable.Count () - nLastElements) की तरह कुछ?
बुह

मैं इस बात को लेकर असहमत हूं। लेकिन मैं एक नाम के रूप में "अंतिम" से "राइट" पसंद करता हूं। मैं IEnumerable <T> के मौजूदा लास्ट को ओवरलोड करने के बारे में थोड़ा व्यग्र हूं। मैं "स्किप," की ओर भी झुकाव कर रहा हूं।
बहुधा डेनियल

मुझे यह समाधान पसंद है। IEnumerable सीखने पर सरल नहीं, बल्कि तीव्र।
pKarelian

1

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

    /// <summary>
    /// Returns characters slices from string between two indexes.
    /// 
    /// If start or end are negative, their indexes will be calculated counting 
    /// back from the end of the source string. 
    /// If the end param is less than the start param, the Slice will return a 
    /// substring in reverse order.
    /// 
    /// <param name="source">String the extension method will operate upon.</param>
    /// <param name="startIndex">Starting index, may be negative.</param>
    /// <param name="endIndex">Ending index, may be negative).</param>
    /// </summary>
    public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
    {
        // If startIndex or endIndex exceeds the length of the string they will be set 
        // to zero if negative, or source.Length if positive.
        if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
        if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;

        // Negative values count back from the end of the source string.
        if (startIndex < 0) startIndex = source.Length + startIndex;
        if (endIndex < 0) endIndex = source.Length + endIndex;         

        // Calculate length of characters to slice from string.
        int length = Math.Abs(endIndex - startIndex);
        // If the endIndex is less than the startIndex, return a reversed substring.
        if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();

        return source.Substring(startIndex, length);
    }

    /// <summary>
    /// Reverses character order in a string.
    /// </summary>
    /// <param name="source"></param>
    /// <returns>string</returns>
    public static string Reverse(this string source)
    {
        char[] charArray = source.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// Verifies that the index is within the range of the string source.
    /// </summary>
    /// <param name="source"></param>
    /// <param name="index"></param>
    /// <returns>bool</returns>
    public static bool ExceedsLength(this string source, int index)
    {
        return Math.Abs(index) > source.Length ? true : false;
    }

इसलिए यदि आपके पास "यह एक विस्तार विधि है" जैसा एक स्ट्रिंग है, तो यहां कुछ उदाहरण और परिणाम की उम्मीद है।

var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"

उम्मीद है कि यह संस्करण किसी के लिए उपयोगी है। यदि आप किसी भी नकारात्मक संख्या का उपयोग नहीं करते हैं, तो यह सामान्य की तरह काम करता है, और सीमा पार से बाहर के लिए चूक प्रदान करता है।


1
string var = "12345678";

if (var.Length >= 4)
{
    var = var.substring(var.Length - 4, 4)
}

// result = "5678"

1

यह मानते हुए कि आप एक तार के बीच में तार चाहते थे जो कि अंतिम वर्ण से 10 वर्णों में स्थित है और आपको केवल 3 वर्णों की आवश्यकता है।

हम कहते हैं StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

उपरोक्त में, मुझे "273"डेटाबेस क्वेरी में उपयोग होने वाली सामग्री निकालने की आवश्यकता है

        //find the length of the string            
        int streamLen=StreamSelected.Length;

        //now remove all characters except the last 10 characters
        string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));   

        //extract the 3 characters using substring starting from index 0
        //show Result is a TextBox (txtStreamSubs) with 
        txtStreamSubs.Text = streamLessTen.Substring(0, 3);

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

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