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





От MSDN:
Replace(String, String, Int32)
Within a specified input string, replaces a specified maximum number of strings that match a regular expression pattern with a specified replacement string.
Разве ты не этого хочешь?
Просто чтобы ответить на исходный вопрос ... Следующее регулярное выражение соответствует только первому экземпляру слова foo:
(?<!foo.*)foo
Это регулярное выражение использует отрицательный просмотр назад (? <!), Чтобы гарантировать, что не будет найдено ни одного экземпляра foo до совпадающего.
Вероятно, вы использовали статический метод. Для этого нет перегрузки (String, String, Int32). Сначала создайте объект регулярного выражения и используйте myRegex.Replace.
В этом случае вы не можете использовать:
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, он представляет количество вхождений, которые должна произойти замена.