Prosimy o jasne posty, które ludzie mogą zrozumieć. Też dla ciebie zredagowałem. Powinieneś był określić język przynajmniej tutaj.
GEOCHET
Oczywiście nigdy nie jest zastępowany ... zawsze jest to nowy ciąg zawierający oryginalny tekst z zastąpionym tekstem. Dzieje się tak, ponieważ ciąg jest niezmienny.
Pablo Marambio
Wypróbowałem metodę `String.Replace ()`. ale zamienia wszystkie „AA” na „XQ”
string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
EDYCJA : Jak wspomniano @itsmatt , istnieje również Regex.Replace (String, String, Int32), który może zrobić to samo, ale prawdopodobnie jest droższy w czasie wykonywania, ponieważ wykorzystuje w pełni funkcjonalny parser, w którym moja metoda wykonuje jedno wyszukiwanie i trzy ciągi konkatenacje.
EDIT2 : Jeśli jest to typowe zadanie, możesz chcieć uczynić tę metodę metodą rozszerzającą:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
Korzystając z powyższego przykładu można teraz napisać:
Ciekawe, czy przetestowałeś swoje założenie, że podejście regex jest droższe w czasie wykonywania? A co z prędkością? Być może wyszukiwanie przy użyciu Regex jest szybsze niż przy użyciu IndexOf?
mfloryan,
Wolę odpowiedź @BilltheLizard obejmującą Remove () i Insert () zamiast tego podejścia z użyciem Substring (). Czy istnieją podstawy, by twierdzić, że jeden jest lepszy od drugiego?
JohnC
3
Uwaga: nie działa to poprawnie w przypadku łączenia znaków lub ligatur w standardzie Unicode. Na przykład ReplaceFirst("oef", "œ", "i")niepoprawnie zwraca „ief” zamiast „if”. Zobacz to pytanie, aby uzyskać więcej informacji.
Michael Liu
2
ReSharper ostrzega String.IndexOf is culture specific.. Bardziej niezawodny do aktualizacji int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64
Jak powiedział itsmatt , Regex.Replace to dobry wybór, jednak aby jego odpowiedź była bardziej kompletna, uzupełnię ją przykładowym kodem:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
Trzeci parametr, w tym przypadku ustawiony na 1, to liczba wystąpień wzorca wyrażenia regularnego, który chcesz zamienić w ciągu wejściowym od początku ciągu.
Miałem nadzieję, że można to zrobić za pomocą statycznego przeciążenia Regex.Replace, ale niestety wygląda na to, że potrzebujesz instancji Regex, aby to osiągnąć.
Jedno z przeciążeń funkcji Regex.Replacetrwa int„Maksymalna liczba przypadków zastąpienia”. Oczywiście używanie Regex.Replacedo zamiany zwykłego tekstu może wydawać się przesadą, ale z pewnością jest zwięzłe:
Odpowiedzi:
Przykład:
EDYCJA : Jak wspomniano @itsmatt , istnieje również Regex.Replace (String, String, Int32), który może zrobić to samo, ale prawdopodobnie jest droższy w czasie wykonywania, ponieważ wykorzystuje w pełni funkcjonalny parser, w którym moja metoda wykonuje jedno wyszukiwanie i trzy ciągi konkatenacje.
EDIT2 : Jeśli jest to typowe zadanie, możesz chcieć uczynić tę metodę metodą rozszerzającą:
Korzystając z powyższego przykładu można teraz napisać:
źródło
ReplaceFirst("oef", "œ", "i")
niepoprawnie zwraca „ief” zamiast „if”. Zobacz to pytanie, aby uzyskać więcej informacji.String.IndexOf is culture specific.
. Bardziej niezawodny do aktualizacjiint pos = text.IndexOf(search, StringComparison.Ordinal);
.Jak powiedział itsmatt , Regex.Replace to dobry wybór, jednak aby jego odpowiedź była bardziej kompletna, uzupełnię ją przykładowym kodem:
Trzeci parametr, w tym przypadku ustawiony na 1, to liczba wystąpień wzorca wyrażenia regularnego, który chcesz zamienić w ciągu wejściowym od początku ciągu.
Miałem nadzieję, że można to zrobić za pomocą statycznego przeciążenia Regex.Replace, ale niestety wygląda na to, że potrzebujesz instancji Regex, aby to osiągnąć.
źródło
"foo"
, ale będziesz potrzebowaćnew Regex(Regex.Escape("foo"))
przenośnego"foo"
.Spójrz na Regex.Replace .
źródło
Biorąc pod uwagę „tylko pierwszy”, być może:
?
Lub bardziej ogólnie:
Następnie:
źródło
znajdzie pierwszy
F
wInputString
i zastąpi goR
.źródło
result = (New Regex("F")).Replace(InputString, "R", 1)
Metoda rozszerzenia C #, która zrobi to:
Cieszyć się
źródło
W składni C #:
źródło
A ponieważ do rozważenia jest również VB.NET, chciałbym zaoferować:
źródło
Zakłada, że
AA
należy wymienić tylko wtedy, gdy znajduje się na samym początku ciągu:Jeśli chcesz zamienić pierwsze wystąpienie
AA
, niezależnie od tego, czy ciąg zaczyna się od niego, czy nie, skorzystaj z rozwiązania od Marca.źródło
Jedno z przeciążeń funkcji
Regex.Replace
trwaint
„Maksymalna liczba przypadków zastąpienia”. Oczywiście używanieRegex.Replace
do zamiany zwykłego tekstu może wydawać się przesadą, ale z pewnością jest zwięzłe:źródło
Dla każdego, komu nie przeszkadza odniesienie
Microsoft.VisualBasic
, istniejeReplace
metoda :źródło
Ten przykład usuwa podciągi (ale jest wolniejszy), ale prawdopodobnie jest znacznie szybszy niż wyrażenie regularne:
źródło
Zaktualizowana metoda rozszerzenia wykorzystująca
Span
do zminimalizowania tworzenia nowych ciągówźródło
źródło