Ответ 1
От MSDN:
Replace(String, String, Int32)
В пределах указанной строки ввода заменяется указанное максимальное количество строк, которое сопоставить шаблон регулярного выражения с указанной заменой.
Разве это не то, что вы хотите?
Кажется, что метод .NET Regex.Replace автоматически заменяет все совпадающие вхождения. Я мог бы предоставить делегат MatchEvaluator, который возвращает согласованную строку после первой замены, не меняя никаких изменений, но для меня это очень неэффективно.
Каков наиболее эффективный способ остановки после первой замены?
От MSDN:
Replace(String, String, Int32)
В пределах указанной строки ввода заменяется указанное максимальное количество строк, которое сопоставить шаблон регулярного выражения с указанной заменой.
Разве это не то, что вы хотите?
Просто чтобы ответить на исходный вопрос... Следующее регулярное выражение соответствует только первому экземпляру слова foo:
(?<!foo.*)foo
В этом регулярном выражении используется отрицательный lookbehind (? <!), чтобы убедиться, что экземпляр 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. Он представляет количество вхождений, которые должна произойти замена.