2008-09-26 11 views
92

मैं किसी दिए गए स्ट्रिंग में पहली घटना को प्रतिस्थापित करना चाहता हूं।मैं .NET में स्ट्रिंग के * पहले उदाहरण * को कैसे बदलूं?

मैं इसे .NET में कैसे पूरा कर सकता हूं?

+0

स्पष्ट पदों है कि लोगों को समझ सकते हैं करें। मैंने यह भी आपके लिए संपादित किया है। आपको कम से कम यहां एक भाषा निर्दिष्ट करनी चाहिए थी। – GEOCHET

+0

बेशक, यह कभी * प्रतिस्थापित नहीं किया गया है ... यह हमेशा एक नई स्ट्रिंग है जिसमें प्रतिस्थापित टेक्स्ट वाला मूल मूल होता है। ऐसा इसलिए है क्योंकि स्ट्रिंग अपरिवर्तनीय है। –

+0

मैंने 'स्ट्रिंग। रीप्लेस()' विधि की कोशिश की। लेकिन यह "XQ" –

उत्तर

16

Regex.Replace पर एक नज़र डालें।

+2

विशेष रूप से, Regex.Replace विधि (स्ट्रिंग, स्ट्रिंग, Int32) चाल करेगा और वास्तव में संक्षिप्त है। – itsmatt

1

Regex.Replace, विशेष रूप से RegEx.Replace (स्ट्रिंग, स्ट्रिंग, int), शायद आप जो खोज रहे हैं। वह या स्ट्रिंग.इंडेक्स जो आपको इंडेक्स देगा और फिर आप स्ट्रिंग को नए टेक्स्ट के साथ काट और पुनर्निर्माण कर सकते हैं।

एक उदाहरण उत्तरार्द्ध का प्रदर्शन (पहले @David Humpohl द्वारा प्रदर्शित होता है):

string str = "Hello WorldWorld"; 

str = ReplaceFirst(str, "World", "StackOverflow "); 

... 

string ReplaceFirst(string text, string search, string replace) 
{ 
    int pos = text.IndexOf(search); 
    if (pos >= 0) 
    { 
     return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); 
    } 
    return text; 
} 
+1

तो आपने अभी अपना उदाहरण कॉपी किया है। आपका बहुत बहुत धन्यवाद। – VVS

116
string ReplaceFirst(string text, string search, string replace) 
{ 
    int pos = text.IndexOf(search); 
    if (pos < 0) 
    { 
    return text; 
    } 
    return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); 
} 

उदाहरण:

string str = "The brown brown fox jumps over the lazy dog"; 

str = ReplaceFirst(str, "brown", "quick"); 

संपादित: mentioned @itsmatt के रूप में, वहाँ भी Regex.Replace है (स्ट्रिंग, स्ट्रिंग, इंट 32), जो वही कर सकता है, लेकिन रनटाइम पर शायद अधिक महंगा है, क्योंकि यह एक पूर्ण विशेषताओं का उपयोग कर रहा है पार्सर जहां मेरी विधि एक खोज और तीन स्ट्रिंग concatenations करता है।

EDIT2:

str = str.ReplaceFirst("brown", "quick"); 
+2

दिलचस्प, क्या आपने रेगेक्स पर रेगेक्स दृष्टिकोण के बारे में अपनी धारणा का परीक्षण किया था? गति के बारे में कैसे? शायद Regex का उपयोग कर खोज इंडेक्सऑफ का उपयोग करने से तेज है? – mfloryan

+0

मैं substring() से जुड़े इस दृष्टिकोण पर निकालें() और सम्मिलित() शामिल @BilltheLizard के जवाब को पसंद करते हैं। क्या कोई कहने का कोई आधार है कि एक दूसरे से बेहतर है? – JohnC

+2

सावधान रहें: यह यूनिकोड वर्णों या लिगचरों के संयोजन के साथ ठीक से काम नहीं करता है। उदाहरण के लिए, 'रीप्लेस फर्स्ट ("ओफ", "œ", "i") "गलत" के बजाय गलत तरीके से "ief" देता है। अधिक जानकारी के लिए [यह सवाल] देखें (http://stackoverflow.com/q/20480016/1127114)। –

6

: लिखने के लिए ऊपर के उदाहरण यह अब संभव है का उपयोग करते हुए

public static class StringExtension 
{ 
    public static string ReplaceFirst(this string text, string search, string replace) 
    { 
    // ...same as above... 
    } 
} 

: यह एक आम काम है, तो आप विधि एक विस्तार विधि बनाने के लिए चाहते हो सकता है सी # सिंटैक्स में:

int loc = original.IndexOf(oldValue); 
if(loc < 0) { 
    return original; 
} 
return original.Remove(loc, oldValue.Length).Insert(loc, newValue); 
6

सी # एक्सटेंशन विधि यह कर देगा:

public static class StringExt 
{ 
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue) 
    { 
     int i = s.IndexOf(oldValue); 
     return s.Remove(i, oldValue.Length).Insert(i, newValue);  
    } 
} 

+0

धन्यवाद!मैंने इसे "RemoveFirst" एक्सटेंशन विधि बनाने के लिए संशोधित किया जो ... स्ट्रिंग से किसी वर्ण की पहली घटना को हटा देता है। – pbh101

+3

यदि पुराना वैल्यू स्ट्रिंग का हिस्सा नहीं है तो यह असफल हो जाएगा। – VVS

4

का आनंद लें और यह भी VB.NET है क्योंकि वहाँ पर विचार करने, मैं पेशकश करने के लिए करना चाहते हैं:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String 
    Dim pos As Integer = text.IndexOf(search) 
    If pos >= 0 Then 
     Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length) 
    End If 
    Return text 
End Function 
55

रूप itsmatt कहा Regex.Replace एक अच्छा है इसके लिए पसंद हालांकि उसका जवाब और अधिक पूरा करने के लिए मैं इसे कोड नमूना के साथ भर दूंगा:

using System.Text.RegularExpressions; 
... 
Regex regex = new Regex("foo"); 
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);    
// result = "bar1 foo2 foo3 foo4" 

तीसरा पैरामीटर, इस मामले में 1 पर सेट, रेगेक्स पैटर्न की घटनाओं की संख्या है जिसे आप स्ट्रिंग की शुरुआत से इनपुट स्ट्रिंग में प्रतिस्थापित करना चाहते हैं।

मुझे उम्मीद थी कि यह एक स्थिर Regex.Replace अधिभार के साथ किया जा सकता है लेकिन दुर्भाग्यवश ऐसा लगता है कि इसे पूरा करने के लिए आपको रेगेक्स उदाहरण की आवश्यकता है।

9
using System.Text.RegularExpressions; 

RegEx MyRegEx = new RegEx("F"); 
string result = MyRegex.Replace(InputString, "R", 1); 

InputString में पहली F खोजने के लिए और R से प्रतिस्थापित कर देगा।

+1

मैंने इसे 'परिणाम = (नया रेगेक्स ("एफ") द्वारा एक-लाइनर में सरलीकृत किया।) बदलें (इनपुटस्ट्रिंग, "आर", 1) ' – cjbarth

+0

यहां का सबसे अच्छा जवाब (सीजेबार्थ के साथ संयोजन में) –

13

, खाते में "पहले केवल" ले रहा है शायद:

int index = input.IndexOf("AA"); 
if (index >= 0) output = input.Substring(0, index) + "XQ" + 
    input.Substring(index + 2); 

?

या अधिक आम तौर पर:

public static string ReplaceFirstInstance(this string source, 
    string find, string replace) 
{ 
    int index = source.IndexOf(find); 
    return index < 0 ? source : source.Substring(0, index) + replace + 
     source.Substring(index + find.Length); 
} 
फिर

:

string output = input.ReplaceFirstInstance("AA", "XQ"); 
4

मानता है कि AA केवल बदला जाना आवश्यक अगर यह स्ट्रिंग की शुरुआत में ही है:

var newString; 
if(myString.StartsWith("AA")) 
{ 
    newString ="XQ" + myString.Substring(2); 
} 

यदि आपको AA की पहली घटना को प्रतिस्थापित करने की आवश्यकता है, तो whet उसकी स्ट्रिंग इसके साथ शुरू होती है या नहीं, मार्क से समाधान के साथ जाओ।

-1
string abc = "AAAAX1"; 

      if(abc.IndexOf("AA") == 0) 
      { 
       abc.Remove(0, 2); 
       abc = "XQ" + abc; 
      } 
3

Regex.Replace के भार के में से एक "बार प्रतिस्थापन हो सकता है की अधिकतम संख्या" के लिए एक int लेता है। जाहिर है, सादा पाठ बदलने के लिए Regex.Replace का उपयोग कर overkill की तरह लग सकता है, लेकिन यह निश्चित रूप से संक्षिप्त है:

string output = (new Regex("AA")).Replace(input, "XQ", 1); 
0

यह उदाहरण दूर सार सबस्ट्रिंग (लेकिन धीमी है), लेकिन एक रेगुलर एक्सप्रेशन से की तुलना में बहुत तेजी से शायद है:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None); 
return parts[0] + "replacement" + parts[1]; 
2

किसी को भी कि Microsoft.VisualBasic के लिए एक संदर्भ मन नहीं करता है के लिए, वहाँ Replace Method है:

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101" 
संबंधित मुद्दे