मैं .NET में स्ट्रिंग के * प्रथम उदाहरण * को कैसे प्रतिस्थापित करूं?


108

मैं दिए गए स्ट्रिंग में पहली घटना को बदलना चाहता हूं।

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


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

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

मैंने कोशिश की `String.Replace ()` विधि। लेकिन यह "एक्सक्यू" के साथ सभी "एए" को बदल देता है
थोरिन ओकेंसिल्ड

2
यह सवाल - stackoverflow.com/questions/141045/… - आपको जो कुछ भी करने की ज़रूरत है उसके बारे में सब कुछ पता चलता है
stack72

1
नोट: एक और इसी तरह के प्रश्न के साथ विलय जो "एए" => "एक्सक्यू" का उपयोग करता है, उदाहरण / खोजने के लिए।
मार्क Gravell

जवाबों:


134
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");

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

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

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

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

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

2
दिलचस्प है, क्या आपने रेगेक्स दृष्टिकोण के बारे में अपनी धारणा का परीक्षण किया था जो रनटाइम के दौरान अधिक महंगा है? गति के बारे में कैसे? शायद Regex का उपयोग करने वाली खोज IndexOf के उपयोग से अधिक तेज़ है?
Mfloryan

मैं इस दृष्टिकोण को हटाना () और इनर्रिंग से संबंधित सम्मिलित करना () से संबंधित @BilltheLizard का उत्तर पसंद करता हूं। क्या यह कहने का कोई आधार है कि एक दूसरे से बेहतर है?
जॉन सीक

3
खबरदार: यह यूनिकोड के साथ वर्णों या संयुक्ताक्षर के ठीक से काम नहीं करता है। उदाहरण के लिए, ReplaceFirst("oef", "œ", "i")गलत तरीके से "इफ" के बजाय "अगर" लौटाता है। अधिक जानकारी के लिए यह प्रश्न देखें ।
माइकल लियू

2
रशर ने चेतावनी दी String.IndexOf is culture specific.। को अद्यतन करने के लिए और अधिक मजबूत int pos = text.IndexOf(search, StringComparison.Ordinal);
कंटैंगो

64

के रूप में 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 अधिभार के साथ किया जा सकता है लेकिन दुर्भाग्य से यह प्रतीत होता है कि आपको इसे पूरा करने के लिए एक Regex उदाहरण की आवश्यकता है।


1
यह शाब्दिक के लिए काम करता है "foo", लेकिन आप new Regex(Regex.Escape("foo"))आलंकारिक के लिए चाहते हैं "foo"
रफिन


15

"पहले केवल" को ध्यान में रखते हुए, शायद:

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");

11
using System.Text.RegularExpressions;

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

Fमें पहली बार मिलेंगे InputStringऔर इसे बदल देंगे R


2
मैंने इसे एक-लाइनर द्वारा सरल कियाresult = (New Regex("F")).Replace(InputString, "R", 1)
cjbarth

यहाँ सबसे अच्छा जवाब (cjbarth के साथ संयोजन के रूप में)
टोड Vance

8

C # एक्सटेंशन विधि जो यह करेगी:

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);    
    } 
}

का आनंद लें


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

4
यदि OldValue स्ट्रिंग का हिस्सा नहीं है, तो यह विफल हो जाएगा।
वीवीएस


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

4

मान लिया जाए कि AAस्ट्रिंग के बहुत शुरुआत में होने पर ही इसे बदलना होगा:

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

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


3

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

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

2

किसी के लिए भी, जिसके लिए कोई संदर्भ नहीं Microsoft.VisualBasicहै, Replaceविधि है :

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"

1

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

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

-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.