Как Regex искать / заменять только первое вхождение в строку в .NET?
Кажется, что метод .NET Regex.Replace автоматически заменяет все совпадающие вхождения. Я мог бы предоставить делегат MatchEvaluator, который возвращает согласованную строку после первой замены, не меняя никаких изменений, но для меня это очень неэффективно.
Какой самый эффективный способ остановиться после первой замены?
- Подсчет количества вхождений строки внутри другой (Perl)
- Многострочное регулярное выражение для соответствия конфигурационному блоку
- Регулярное выражение, разделите строку заглавной буквой, но игнорируйте TLA
- Группа захвата regex java
- Как найти строку с максимальным количеством столбцов / символов в Vim / gVim?
- Parse Date from String в этом формате: dd / MM / yyyy
- Возможно ли совместить вложенные скобки с регулярным выражением без использования рекурсивных или балансировочных групп?
- Группы балансировки в переменной длины lookbehind
- Синтаксическая ошибка в IE с использованием функций ES6 arrow
- Как искать в PDF-файлах с использованием регулярных выражений?
- Можно ли заменить несколько элементов в одном регулярном выражении в VIM или Perl?
- C # regex для получения идентификатора видео с youtube и vimeo по URL-адресу
- Извлечение названных групп регулярного выражения в LibreOffice Calc
Из MSDN :
Replace(String, String, Int32)
В пределах указанной строки ввода заменяется указанное максимальное количество строк, которые соответствуют шаблону регулярного выражения с указанной строкой замены.
Разве это не то, чего вы хотите?
Чтобы ответить на исходный вопрос … Следующее регулярное выражение соответствует только первому экземпляру слова foo:
(?
В этом регулярном выражении используется отрицательный lookbehind (?
Вероятно, вы использовали статический метод. Для этого нет (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 , Он представляет количество случаев, в которые должна произойти замена.
Вместо создания new Regex
вы также можете сделать
Regex.Replace(originalString, "^"+pattern, stringToReplaceWith);
чтобы заменить первое вхождение.