string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
РЕДАКТИРОВАТЬ : как упоминалось в @itsmatt , есть также Regex.Replace (String, String, Int32), который может делать то же самое, но, вероятно, дороже во время выполнения, поскольку он использует полнофункциональный синтаксический анализатор, где мой метод выполняет одну находку и три строки конкатенации.
EDIT2 : если это обычная задача, вы можете сделать метод методом расширения:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
Используя приведенный выше пример, теперь можно написать:
Интересно, вы проверили свое предположение о том, что подход регулярных выражений более дорог во время выполнения? Как насчет скорости? Возможно, поиск с использованием Regex быстрее, чем с помощью IndexOf?
mfloryan 05
Я предпочитаю ответ @BilltheLizard с участием Remove () и Insert () по сравнению с этим подходом с использованием Substring (). Есть ли основания утверждать, что одно лучше другого?
JohnC
3
Осторожно: это не работает должным образом с Unicode, объединяющим символы или лигатуры. Например, ReplaceFirst("oef", "œ", "i")неправильно возвращает «ief» вместо «if». См. Этот вопрос для получения дополнительной информации.
Майкл Лю
2
ReSharper предупреждает String.IndexOf is culture specific.. Более надежный для обновления до int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango,
64
Как itsmatt сказал Regex.Replace является хорошим выбором для этого , однако , чтобы сделать его ответ более полным , я заполню ее с образцом кода:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
Третий параметр, установленный в 1 в этом случае, - это количество вхождений шаблона регулярного выражения, который вы хотите заменить во входной строке с начала строки.
Я надеялся, что это можно сделать с помощью статической перегрузки Regex.Replace, но, к сожалению, для этого вам нужен экземпляр Regex.
Одним из перегруженных Regex.Replaceпринимает intдля «максимального количества раз могут произойти замена». Очевидно, что использование Regex.Replaceдля замены обычного текста может показаться излишним, но оно определенно лаконично:
Ответы:
Пример:
РЕДАКТИРОВАТЬ : как упоминалось в @itsmatt , есть также Regex.Replace (String, String, Int32), который может делать то же самое, но, вероятно, дороже во время выполнения, поскольку он использует полнофункциональный синтаксический анализатор, где мой метод выполняет одну находку и три строки конкатенации.
EDIT2 : если это обычная задача, вы можете сделать метод методом расширения:
Используя приведенный выше пример, теперь можно написать:
источник
ReplaceFirst("oef", "œ", "i")
неправильно возвращает «ief» вместо «if». См. Этот вопрос для получения дополнительной информации.String.IndexOf is culture specific.
. Более надежный для обновления доint pos = text.IndexOf(search, StringComparison.Ordinal);
.Как itsmatt сказал Regex.Replace является хорошим выбором для этого , однако , чтобы сделать его ответ более полным , я заполню ее с образцом кода:
Третий параметр, установленный в 1 в этом случае, - это количество вхождений шаблона регулярного выражения, который вы хотите заменить во входной строке с начала строки.
Я надеялся, что это можно сделать с помощью статической перегрузки Regex.Replace, но, к сожалению, для этого вам нужен экземпляр Regex.
источник
"foo"
, но вам понадобитсяnew Regex(Regex.Escape("foo"))
переносное"foo"
.Взгляните на Regex.Replace .
источник
С учетом «только первого», возможно:
?
Или в более общем плане:
Затем:
источник
найти первый
F
вInputString
и заменить егоR
.источник
result = (New Regex("F")).Replace(InputString, "R", 1)
Метод расширения C #, который сделает это:
наслаждаться
источник
В синтаксисе C #:
источник
И поскольку следует рассмотреть также VB.NET, я хотел бы предложить:
источник
Предполагает, что его
AA
нужно заменить только в том случае, если он находится в самом начале строки:Если вам нужно заменить первое вхождение
AA
, независимо от того, начинается ли с него строка или нет, воспользуйтесь решением от Marc.источник
Одним из перегруженных
Regex.Replace
принимаетint
для «максимального количества раз могут произойти замена». Очевидно, что использованиеRegex.Replace
для замены обычного текста может показаться излишним, но оно определенно лаконично:источник
Для всех, кто не возражает против ссылки
Microsoft.VisualBasic
, естьReplace
Метод :источник
Этот пример абстрагирует подстроки (но работает медленнее), но, вероятно, намного быстрее, чем RegEx:
источник
Обновленный метод расширения,
Span
позволяющий минимизировать создание новой строкиисточник
источник