Je veux remplacer la première occurrence dans une chaîne donnée.
Comment puis-je accomplir cela dans .NET?
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);
}
Exemple:
string str = "The brown brown fox jumps over the lazy dog";
str = ReplaceFirst(str, "brown", "quick");
[~ # ~] modifier [~ # ~] : comme @itsmatt mentionné , il y a aussi Regex.Replace (String, String, Int32), qui peut faire de même, mais est probablement plus cher à l'exécution, car il utilise un analyseur complet où ma méthode fait une recherche et trois concaténations de chaînes.
EDIT2 : S'il s'agit d'une tâche courante, vous souhaiterez peut-être faire de la méthode une méthode d'extension:
public static class StringExtension
{
public static string ReplaceFirst(this string text, string search, string replace)
{
// ...same as above...
}
}
En utilisant l'exemple ci-dessus, il est maintenant possible d'écrire:
str = str.ReplaceFirst("brown", "quick");
Comme itsmatt l'a dit Regex.Replace est un bon choix pour cela, mais pour rendre sa réponse plus complète, je le remplirai avec un exemple de code:
using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);
// result = "bar1 foo2 foo3 foo4"
Le troisième paramètre, défini sur 1 dans ce cas, est le nombre d'occurrences du modèle d'expression régulière que vous souhaitez remplacer dans la chaîne d'entrée depuis le début de la chaîne.
J'espérais que cela pourrait être fait avec une surcharge statique Regex.Replace mais malheureusement il semble que vous ayez besoin d'une instance Regex pour l'accomplir.
Jetez un oeil à Regex.Replace .
En tenant compte du "premier seulement", peut-être:
int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
input.Substring(index + 2);
?
Ou plus généralement:
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);
}
Ensuite:
string output = input.ReplaceFirstInstance("AA", "XQ");
using System.Text.RegularExpressions;
RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);
trouvera d'abord F
dans InputString
et le remplacera par R
.
En syntaxe C #:
int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Méthode d'extension C # qui fera cela:
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);
}
}
Prendre plaisir
Suppose que AA
ne doit être remplacé que s'il se trouve au tout début de la chaîne:
var newString;
if(myString.StartsWith("AA"))
{
newString ="XQ" + myString.Substring(2);
}
Si vous devez remplacer la première occurrence de AA
, que la chaîne commence par elle ou non, optez pour la solution de Marc.
Et parce qu'il y a aussi VB.NET à considérer, je voudrais offrir:
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
L'une des surcharges de Regex.Replace
prend un int
pour "Le nombre maximal de fois que le remplacement peut se produire". De toute évidence, en utilisant Regex.Replace
pour le remplacement de texte brut peut sembler exagéré, mais il est certainement concis:
string output = (new Regex("AA")).Replace(input, "XQ", 1);
Pour tous ceux qui ne se soucient pas d'une référence à Microsoft.VisualBasic
, il y a la Replace
méthode :
string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
Regex.Replace , en particulier RegEx.Replace (string, string, int), est probablement ce que vous recherchez. Cela ou String.IndexOf qui vous donnera l'index et vous pourrez ensuite couper et reconstruire la chaîne avec le nouveau texte que vous souhaitez.
Un exemple démontrant ce dernier (comme d'abord démontré par @ 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;
}
Cet exemple résume les sous-chaînes (mais est plus lent), mais est probablement beaucoup plus rapide qu'un RegEx:
var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];