Подтвердить что ты не робот

Как Regex искать/заменять только первое вхождение в строку в .NET?

Кажется, что метод .NET Regex.Replace автоматически заменяет все совпадающие вхождения. Я мог бы предоставить делегат MatchEvaluator, который возвращает согласованную строку после первой замены, не меняя никаких изменений, но для меня это очень неэффективно.

Каков наиболее эффективный способ остановки после первой замены?

4b9b3361

Ответ 1

От MSDN:

Replace(String, String, Int32)   

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

Разве это не то, что вы хотите?

Ответ 2

Просто чтобы ответить на исходный вопрос... Следующее регулярное выражение соответствует только первому экземпляру слова foo:

(?<!foo.*)foo

В этом регулярном выражении используется отрицательный lookbehind (? <!), чтобы убедиться, что экземпляр foo не найден до сопоставления.

Ответ 3

Вероятно, вы использовали статический метод. Для этого нет (String, String, Int32) перегрузки. Сначала создайте объект регулярного выражения и используйте myRegex.Replace.

Ответ 4

В этом случае вы не можете использовать:

string str ="abc546_$defg";
str = Regex.Replace(str,"[^A-Za-z0-9]", "");

Вместо этого вам нужно объявить новый экземпляр Regex и использовать его следующим образом:

string str ="abc546_$defg";
Regex regx = new Regex("[^A-Za-z0-9]");
str = regx.Replace(str,"",1)

Обратите внимание на 1. Он представляет количество вхождений, которые должна произойти замена.