एक स्ट्रिंग से केवल सही अधिकांश एन अक्षर निकालें


110

मैं कैसे निकाल सकता हूं substringजो दूसरे से सबसे सही छह अक्षरों से बना है string?

उदाहरण के लिए: मेरी स्ट्रिंग है "PER 343573"। अब मैं केवल निकालना चाहता हूं "343573"

मैं यह कैसे कर सकता हूँ?


आप VB.NET अधिकार विधि के लिए स्रोत कोड का उपयोग कर सकते हैं। आपको C # पहली में कनवर्ट करना होगा: referenceource.microsoft.com/#Microsoft.VisualBasic/… कन्वर्टर
डैरेन ग्रिफ़िथ

लेकिन VB कोड स्ट्रिंग्स में सी # सबस्ट्रिंग फंक्शन पर निर्भर करता है ।sc
Our Man in Bananas

यह वास्तव में इसे करने का एक बहुत अच्छा तरीका नहीं है, लेकिन यदि आप चुटकी में हैं, तो आप Microsoft.VisualBasic.dll में एक संदर्भ जोड़ सकते हैं, और सही विधि का उपयोग कर सकते हैं। यह एक विस्तार विधि नहीं है। आपको इसे इस तरह से उपयोग करना होगा:string endOfString = Strings.Right(wholeString, 6);
एलन मैक्बी - एमएसएफटी

जवाबों:


156
string SubString = MyString.Substring(MyString.Length-6);

35
यह अरोच सही ढंग से काम नहीं करता है यदि स्ट्रिंग उतने लंबे समय तक नहीं है जितनी कि आवश्यक वर्णों की संख्या है।
13

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

2
@ जोहान्स रोसेल - मैं नियमित अभिव्यक्ति का एक बड़ा प्रशंसक हूं (मेरे उत्तर देखें), लेकिन मैं इस तरह की एक साधारण स्थिति के लिए उन्हें फिर से शामिल नहीं करूंगा। फ़ंक्शन आवरण का उपयोग करने वाले किसी भी उत्तर को नियमित अभिव्यक्ति की तुलना में कोड मेनटेनेंस के लिए बेहतर अनुकूल है। एक विस्तार विधि (या मानक फ़ंक्शन यदि .NET 2.0) सबसे अच्छा समाधान है।
स्टेवेपवेल 14

@ Stevo3000 - यदि स्ट्रिंग गलत लंबाई है तो एक समाधान एक वैध समाधान है। एकमात्र समाधान नहीं है, लेकिन फिर भी।
मार्क एल।

3
@ नाम - केवल परोपकार के रूप में होना, केवल शीर्षक "एन अक्षर"। वास्तविक प्रश्न "सबसे सही छह अक्षर" के लिए पूछा गया :)
क्रिस रोजर्स

69

Right(n);फ़ंक्शन को व्यक्त करने के लिए एक विस्तार विधि लिखें । फ़ंक्शन को रिक्त स्ट्रिंग को लौटाने वाले रिक्त या रिक्त तारों से निपटना चाहिए, अधिकतम लंबाई की तुलना में कम स्ट्रिंग और मूल स्ट्रिंग की तुलना में लंबे समय तक तार सही लंबाई की अधिकतम लंबाई लौटाते हैं।

public static string Right(this string sValue, int iMaxLength)
{
  //Check if the value is valid
  if (string.IsNullOrEmpty(sValue))
  {
    //Set valid empty string as string could be null
    sValue = string.Empty;
  }
  else if (sValue.Length > iMaxLength)
  {
    //Make the string no longer than the max length
    sValue = sValue.Substring(sValue.Length - iMaxLength, iMaxLength);
  }

  //Return the string
  return sValue;
}

प्रारंभ अनुक्रमणिका 0 से कम नहीं हो सकती।
जेम्स

2
@James - एक सबरिंग कॉल करने sValue.Length > iMaxLengthसे पहले ऐसा नहीं होगा !
स्टेवशिपवेल

3
शानदार उत्तर, लेकिन C # कोड में हंगेरियन अंकन को देखने के लिए एक डबल-ले की एक बिट थी।
यरद रोज़

1
@JeradRose - मैं एक ऐसी परियोजना में काम करता हूँ जहाँ कोड आधार VB3 अनुप्रयोग से विकसित हुआ है (यह सबसे VB.NET है) इसलिए कुछ अवशेष हैं।
स्टीववेवेल जुएल 14'14

4
@ जले, वीबी.नेट में लेफ्ट, राइट और मिड टॉप लेवल के फंक्शन हैं, साथ ही कई अन्य सहायक चीजें हैं जो C # का हिस्सा नहीं हैं। सुनिश्चित नहीं हैं कि क्यों, उनमें से कई सभ्य कार्य हैं।
ingredient_15939

40

संभवतः विस्तार विधि का उपयोग करने के लिए अच्छा है:

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

प्रयोग

string myStr = "PER 343573";
string subStr = myStr.Right(6);

19
तब यह एक NullReferenceException को वैसे ही फेंक देगा जैसे कि यदि आप किसी नल स्ट्रिंग पर किसी भी विधि का उपयोग करने का प्रयास करते हैं ...
James

1
str.Length - lengthनकारात्मक हो सकता है। इसके अलावा दूसरा पैरामीटर वैकल्पिक है। लंबाई पास करने की आवश्यकता नहीं है।
इहर्ट्स्कर्प २१'१cs

1
@ JMS10 यह निश्चित रूप से हो सकता है, लेकिन फोन करने वालों की चिंता मेरी तुलना में अधिक है। इसके अलावा, हाँ उचित बिंदु, आप ओवरराइड का उपयोग कर सकते हैं जो यहां एकल पैरामीटर लेता है।
जेम्स

str .Substring (str .ength - लंबाई, लंबाई);
लुडोवो

26
using System;

public static class DataTypeExtensions
{
    #region Methods

    public static string Left(this string str, int length)
    {
        str = (str ?? string.Empty);
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        str = (str ?? string.Empty);
        return (str.Length >= length)
            ? str.Substring(str.Length - length, length)
            : str;
    }

    #endregion
}

त्रुटि नहीं होनी चाहिए, रिक्त स्ट्रिंग के रूप में नल देता है, छंटनी या आधार मान देता है। इसे "testx" की तरह उपयोग करें। Left (4) या str.Right (12);


13

MSDN

String mystr = "PER 343573";
String number = mystr.Substring(mystr.Length-6);

संपादित करें: बहुत धीमी गति से ...


9

यदि आप अपनी स्ट्रिंग की लंबाई के बारे में सुनिश्चित नहीं हैं, लेकिन आप शब्दों की गिनती (इस मामले में हमेशा 2 शब्द, जैसे 'xxx yyyyyy) के बारे में निश्चित हैं, तो आप बेहतर विभाजन का उपयोग करेंगे।

string Result = "PER 343573".Split(" ")[1];

यह हमेशा आपके स्ट्रिंग का दूसरा शब्द देता है।


हाँ; चलो मान लेते हैं कि ओपी का पाठ हमेशा सफेद स्थान रखता है; उनके उदाहरण की तरह :)
क्रिश्चियन

1
हेई क्रिश्चियन :) हम सभी एक उत्तर की कुछ पंक्तियों से अधिक जानते हैं। मैंने अभी प्रश्न का संक्षेप में उत्तर दिया है, निश्चित रूप से, वास्तविक कोड पर विचार करने के लिए बहुत अधिक चीजें हैं।
महदी तहसीलदार

7

यह ठीक वैसा नहीं है जैसा आप पूछ रहे हैं, बल्कि उदाहरण को देखते हुए, ऐसा प्रतीत होता है कि आप स्ट्रिंग के संख्यात्मक खंड की तलाश कर रहे हैं।

यदि यह हमेशा होता है, तो इसे करने का एक अच्छा तरीका एक नियमित अभिव्यक्ति का उपयोग करना होगा।

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;

-1 रेगुलर एक्सप्रेशन कुछ इस तरह से ओवरकिल होते हैं, खासकर जब इसे करने के तरीकों में पहले से ही निर्मित हो।
जेम्स

1
मैं इस पद्धति का उपयोग करने के लिए बहस नहीं कर रहा हूं यदि आपको वास्तव में केवल अंतिम 6 की आवश्यकता है, लेकिन यदि आपका लक्ष्य एक संख्या (जैसे आईडी) निकालना है जो भविष्य में किसी बिंदु पर 5 या 7 अंकों में बदल सकता है, तो एक बेहतर तरीका है।
13:42 पर चिल्स42

1
पुराने उत्तर, लेकिन नियमित अभिव्यक्तियों के उपयोग के लिए +1। विशेष रूप से जब से (अभी भी) इस @James को करने के लिए .NET के स्ट्रिंग कार्यान्वयन में कोई अंतर्निहित तरीके नहीं हैं। अन्यथा, यह प्रश्न कभी अस्तित्व में नहीं होता।
CrazyIvan1974

@ CrazyIvan1974 सुनिश्चित नहीं है कि आपने मुझे अपनी टिप्पणी में क्यों उल्लेख किया है
जेम्स

5

इसे इस्तेमाल करो:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}

? पाठ .Substring (text.Length - 6)
Ludwo

5

अपनी आवश्यकताओं पर अनुमान लगाना लेकिन निम्नलिखित नियमित अभिव्यक्ति स्ट्रिंग के अंत से पहले केवल 6 अल्फ़ान्यूमेरिक्स पर निकलेगी और अन्यथा कोई मैच नहीं होगा।

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;

क्या यह समाधान यथोचित रूप से अस्पष्ट आवश्यकताओं को पूरा नहीं करता है? यदि नहीं, तो कृपया अपना डाउन वोटिंग समझाएं।
वेड

5

चूंकि आप .NET का उपयोग कर रहे हैं, जो सभी MSIL के लिए संकलित करते हैं , बस Microsoft का संदर्भ लें। विजुअलBasic , और Microsoft की अंतर्निहित Strings.Rightपद्धति का उपयोग करें :

using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);

कोई कस्टम एक्सटेंशन विधि या अन्य कार्य बनाने की आवश्यकता नहीं है। परिणाम एक संदर्भ और कोड की एक सरल रेखा के साथ प्राप्त किया जाता है।

इस पर आगे की जानकारी के रूप में, C # के साथ Visual Basic विधियों का उपयोग करके कहीं और प्रलेखित किया गया है । मैं व्यक्तिगत रूप से एक फ़ाइल पार्स करने की कोशिश करते समय पहले उस पर ठोकर खाई, और इस SO थ्रेड को Microsoft.VisualBasic.FileIO.TextFieldParserपार्सिंग के लिए अत्यंत उपयोगी होने के लिए पाया ।csv फाइलें।


यह दृष्टिकोण यहाँ एक अन्य SO थ्रेड में भी विस्तृत था: stackoverflow.com/a/15255454/2658159
हारून थॉमस

यह मानसिक है! लेकिन VB आदमी के रूप में, इसे एक बार के लिए CSharpers पर लॉर्ड करना अच्छा है!
स्टीविन्क

5
var str = "PER 343573";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "343573"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573"

यह चरित्र की किसी भी संख्या का समर्थन करता है str। वैकल्पिक कोड nullस्ट्रिंग का समर्थन नहीं करता है। और, पहला तेज है और दूसरा अधिक कॉम्पैक्ट है।

यदि दूसरा strशॉर्ट स्ट्रिंग है , तो मैं दूसरा पसंद करता हूं । यदि यह लंबी स्ट्रिंग है तो पहले वाला अधिक उपयुक्त है।

जैसे

var str = "";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // ""
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // ""

या

var str = "123";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "123"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"

1
मुझे वह विकल्प पसंद है। क्रिया, लेकिन समझने में आसान और स्वचालित रूप से स्ट्रिंग-बहुत-छोटी समस्या को संभालती है।
एंड्रयू ग्रोटे


3

एक अन्य समाधान जिसका उल्लेख नहीं किया जा सकता है

S.Substring(S.Length < 6 ? 0 : S.Length - 6)

3

अशक्त सुरक्षित तरीके:

मूल स्ट्रिंग को लौटाने वाली अधिकतम लंबाई से छोटी स्ट्रिंग्स

स्ट्रिंग राइट एक्सटेंशन विधि

public static string Right(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse());

स्ट्रिंग वाम विस्तार विधि

public static string Left(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Take(count));

2

यहां मैं इसका उपयोग कर रहा हूं समाधान ... यह जांचता है कि इनपुट स्ट्रिंग की लंबाई पूछी गई लंबाई से कम नहीं है। मेरे द्वारा पोस्ट किए गए समाधान इसे दुर्भाग्य से खाते में नहीं लेते हैं - जिससे दुर्घटना हो सकती है।

    /// <summary>
    /// Gets the last x-<paramref name="amount"/> of characters from the given string.
    /// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned.
    /// If the given <paramref name="amount"/> is negative, an empty string will be returned.
    /// </summary>
    /// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>
    /// <param name="amount">The amount of characters to return.</param>
    /// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>
    public static string GetLast(this string @string, int amount)
    {
        if (@string == null) {
            return @string;
        }

        if (amount < 0) {
            return String.Empty;
        }

        if (amount >= @string.Length) {
            return @string;
        } else {
            return @string.Substring(@string.Length - amount);
        }
    }

2

यह वह विधि है जिसका मैं उपयोग करता हूं: मैं चीजों को सरल रखना पसंद करता हूं।

private string TakeLast(string input, int num)
{
    if (num > input.Length)
    {
        num = input.Length;
    }
    return input.Substring(input.Length - num);
}


1
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")

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

1
ओपी में इस मुद्दे को ठीक करने के बारे में लिखित स्पष्टीकरण के साथ कोड होना चाहिए।
ज़ज़ करें

1
खैर, मुझे लगा कि टिप्पणियों में लिखित स्पष्टीकरण पर्याप्त था, नहीं?
vldmrrr

0

बिट कन्वर्टर और बिट शिफ्टिंग (एन्कोडिंग के बारे में सुनिश्चित होना) का सहारा लिए बिना, यह सबसे तेज़ तरीका है जिसका मैं विस्तार विधि 'राइट' के रूप में उपयोग करता हूं।

string myString = "123456789123456789";

if (myString > 6)
{

        char[] cString = myString.ToCharArray();
        Array.Reverse(myString);
        Array.Resize(ref myString, 6);
        Array.Reverse(myString);
        string val = new string(myString);
}

2
Array.Reverseएक सरणी लेता है, एक स्ट्रिंग नहीं है, और if (myString.length > 6)। सिंटैक्स त्रुटियां एक तरफ, यह सबसे तेज़ तरीका क्यों होगा? निश्चित रूप से सिर्फ सबस्ट्रिंग का उपयोग करना एक बेहतर तरीका होगा, इसमें सरणियों की नकल की आवश्यकता नहीं होगी।
1800 सूचना

0

मैं नकारात्मक स्थितियों को रोकने के लिए मिन का उपयोग करता हूं और अशक्त तारों को भी संभालता हूं

// <summary>
    /// Returns a string containing a specified number of characters from the right side of a string.
    /// </summary>
    public static string Right(this string value, int length)
    {
        string result = value;
        if (value != null)
            result = value.Substring(0, Math.Min(value.Length, length));
        return result;
    }

0
using Microsoft.visualBasic;

 public class test{
  public void main(){
   string randomString = "Random Word";
   print (Strings.right(randomString,4));
  }
 }

आउटपुट "वर्ड" है

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