किसी शब्द की अंतिम घटना को स्ट्रिंग में बदलें - C #


82

मुझे एक समस्या है जहाँ मुझे एक स्ट्रिंग में एक शब्द की अंतिम घटना को बदलने की आवश्यकता है।

स्थिति: मुझे एक स्ट्रिंग दी गई है जो इस प्रारूप में है:

string filePath ="F:/jan11/MFrame/Templates/feb11";

मैं तो TnaNameइस तरह की जगह :

filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName

यह काम करता है, लेकिन मुझे एक समस्या है जब TnaNameमेरी जैसी ही है folder name। जब ऐसा होता है तो मैं इस तरह से एक स्ट्रिंग प्राप्त कर रहा हूं:

F:/feb11/MFrame/Templates/feb11

अब यह दोनों घटनाओं की जगह है TnaNameके साथ feb11। क्या कोई तरीका है कि मैं अपनी स्ट्रिंग में केवल शब्द की अंतिम घटना को प्रतिस्थापित कर सकता हूं?

नोट: feb11है TnaName- कि एक समस्या नहीं है जो किसी अन्य प्रक्रिया से आता है।


क्या आपका एकमात्र लक्ष्य पथ के अंतिम भाग को बदलना है? (वह है, /आगे से?)
— साइमन व्हाइटहेड

कोई अंतिम भाग नहीं है केवल पिछले भाग में ही TnaNameअधिक है लेकिन मैं प्रश्न के लिए केवल नमूना उत्पन्न करता हूं। धन्यवाद
— श्री

1
क्या यह तार हमेशा किसी चीज का मार्ग है? अगर यह है तो System.IO.Path क्लास का उपयोग करने पर विचार करें।
— यूरी Rozhovetskiy

हाँ स्ट्रिंग हमेशा कुछ के लिए एक रास्ता है।
— श्री

जवाबों:


178

यहाँ एक स्ट्रिंग की अंतिम घटना को बदलने का कार्य है

public static string ReplaceLastOccurrence(string Source, string Find, string Replace)
{
        int place = Source.LastIndexOf(Find);

        if(place == -1)
           return Source;

        string result = Source.Remove(place, Find.Length).Insert(place, Replace);
        return result;
}
  • Source वह स्ट्रिंग है जिस पर आप ऑपरेशन करना चाहते हैं।
  • Find वह स्ट्रिंग है जिसे आप बदलना चाहते हैं।
  • Replace वह स्ट्रिंग है जिसे आप इसे बदलना चाहते हैं।

जेनेरिक फंक्शन के लिए बहुत बहुत धन्यवाद। काम करता है और मैं @Simon से भी सहमत हूं।
— श्री

6
खबरदार, शायद कोई मेल नहीं है (यानी Place == -1)
— अलीरज़ा नूरी

7
यह संभव है कि केस मैच में खाली स्ट्रिंग की तुलना में स्रोत लौटना अधिक तार्किक हो।
— साशा

2
आपको "स्रोत लौटना चाहिए;" के बजाय "वापसी स्टिंग। खाली?" क्योंकि इसकी तार्किक असफलता का पता लगाएं यदि स्ट्रिंग की कोई घटना नहीं मिली।
— जिग्नेश वैरिया

1
जोड़ें इस : के रूप में और के बीच (स्ट्रिंग स्रोत public static string ReplaceLastOccurance(this string Source...और आप गंधा विस्तार विधि है कि आप किसी भी स्ट्रिंग के लिए स्ट्रिंग के अंतिम घटना को बदलने के लिए उपयोग कर सकते हैं।
— beaudetious

12

string.LastIndexOf()स्ट्रिंग की अंतिम घटना के सूचकांक को खोजने के लिए उपयोग करें और फिर अपने समाधान की तलाश करने के लिए प्रतिस्थापन का उपयोग करें।


7

आपको मैन्युअल रूप से प्रतिस्थापित करना होगा:

int i = filePath.LastIndexOf(TnaName);
if (i >= 0)
    filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);

3

मैं नहीं देखता कि रेगेक्स का उपयोग क्यों नहीं किया जा सकता है:

public static string RegexReplace(this string source, string pattern, string replacement)
{
  return Regex.Replace(source,pattern, replacement);
}

public static string ReplaceEnd(this string source, string value, string replacement)
{
  return RegexReplace(source, $"{value}$", replacement);
}

public static string RemoveEnd(this string source, string value)
{
  return ReplaceEnd(source, value, string.Empty);
}

उपयोग:

string filePath ="F:/feb11/MFrame/Templates/feb11";
filePath = filePath.RemoveEnd("feb11"); // F:/feb11/MFrame/Templates/
filePath = filePath.ReplaceEnd("feb11","jan11"); // F:/feb11/MFrame/Templates/jan11

1
आपको Regex.Escape () मान चाहिए।
— 19

तुम्हारा मतलब है return Regex.Replace(Regex.Replace(source),pattern, replacement);?
— टोडरमो

मान लीजिए कि कोई व्यक्ति प्रतिस्थापन ("(फ़ोबार)", ")", "तत्कालीन") कहता है। आपका फ़ंक्शन फेंक देगा, क्योंकि ") $" एक अमान्य रेगेक्स है। यह काम करेगा: RegexReplace (स्रोत, Regex.Escape (मान) + "$", प्रतिस्थापन) लौटाएं; अपने RemoveEnd के लिए एक ही कहानी।
— jcox

@jcox, मैं यह पता नहीं लगा सका कि दोहरे-बचने से कैसे बचें, बी / सी प्रत्येक फ़ंक्शन सार्वजनिक है इसलिए हमारे पास कई संभावित कॉल पथ हैं। मेरे मामले में मैं इसे विशेष पात्रों के लिए उपयोग नहीं कर रहा था, लेकिन मैं आपकी बात देख रहा हूं।
— टोडरमो

@toddmo मेरे पास रिप्लेसएंड और रिमेन्ड कॉल Regex.Replace होगा। Kinda ऑफ-टॉपिक, हालाँकि; मैं बस लोगों को जागरूक करना चाहूंगा कि उपयोगकर्ता इनपुट को एक रेगेक्स पैटर्न में इंजेक्ट करना मुश्किल हो सकता है। एक्सएमएल या एसक्यूएल में इनपुट इंजेक्ट करने के समान - कुछ भागने की व्यवस्था होने की आवश्यकता है।
— jcox


0

समाधान को एक लाइन के साथ और भी सरल रूप से लागू किया जा सकता है:

 static string ReplaceLastOccurrence(string str, string toReplace, string replacement)
    {
        return Regex.Replace(str, $@"^(.*){toReplace}(.*?)$", $"$1{replacement}$2");
    }

इसके द्वारा हम regex तारांकन ऑपरेटर के लालच का लाभ उठाते हैं। फ़ंक्शन का उपयोग इस तरह किया जाता है:

var s = "F:/feb11/MFrame/Templates/feb11";
var tnaName = "feb11";
var r = ReplaceLastOccurrence(s,tnaName, string.Empty);

0
var lastIndex = filePath.LastIndexOf(TnaName);

filePath = filePath.Substring(0, lastIndex);

2
हालांकि कोड-ओनली उत्तर प्रश्न का उत्तर दे सकते हैं, आप अपने कोड के लिए संदर्भ प्रदान करके आपके उत्तर की गुणवत्ता में काफी सुधार कर सकते हैं, यह कोड क्यों काम करता है, और आगे पढ़ने के लिए प्रलेखन के कुछ संदर्भ। उत्तर से कैसे : "ब्रेविटी स्वीकार्य है, लेकिन फुलर स्पष्टीकरण बेहतर हैं।"
— प्रणव होसांगदी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.