2012-01-10 3 views
90

Можно создать дубликат:
How do I replace the first instance of a string in .NET?Заменить первое вхождение шаблона в строке

Скажем, у меня есть строка:

string s = "Hello world."; 

как я могу заменить первый o в слове Hello, скажем, Foo?

Другими словами я хочу закончить с:

"HellFoo world." 

Я знаю, как заменить все Выходов, но я хочу, чтобы заменить только первый один

ответ

162

Я думаю, что вы можете использовать перегрузку Regex.Replace, чтобы указать максимальное количество раз, чтобы заменить ...

var regex = new Regex(Regex.Escape("o")); 
var newText = regex.Replace("Hello World", "Foo", 1); 
+7

Просто примечание: это опасно, если искомая строка может быть интерпретирована как регулярное выражение (например: поиск строки " (встреча "приведет к ошибке, потому что она интерпретируется как неполное регулярное выражение ... – JFTxJ

+6

@JFTxJ - Хорошая идея! Использование Regex.Escape в параметре вашего конструктора Regex должно помочь там. Соответственно отредактированный пример. – Reddog

+2

Aaaa! – JFTxJ

10

Есть несколько способов, которые вы может сделать это, но самым быстрым может быть использование IndexOf для поиска позиции индекса буквы, которую вы хотите заменить, а затем подстроить текст до и после того, что вы хотите заменить.

+0

Аналогичным образом можно заменить n-ое вхождение строки с помощью счетчика, заменить KeachyPeenReturns

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

здесь является метод расширения, который также может работать также на VoidKing запросу

public static class StringExtensionMethods 
{ 
    public static string ReplaceFirst(this 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); 
    } 
} 
+7

намного лучше, чем регулярное выражение imho, это то, что в конечном итоге будет делать регулярное выражение, пропуская накладные расходы. В очень длинных строках с результатом очень далеко в конце, regex impl может быть лучше, поскольку он поддерживает потоковое массивы char, но для небольших строк это кажется намного более эффективным ... – Jaap

+1

Возможно, вам придется добавить «статический», к этому методу. Статический метод, поле, свойство или событие могут быть вызваны в классе, даже если экземпляр класса не был создан. Для меня это повлияло на то, мог ли я вызвать этот метод, содержащийся в моем файле .cs с моей .cshtml-страницы, используя веб-страницы C# .NET. Это потому, что мой класс также статичен. Я тоже предпочитаю этот метод по принятому ответу. – VoidKing

+3

@ VoidKing Лучше все еще: сделайте это расширением. – Dabblernl

Смежные вопросы