Regex - заменить только последнюю часть выражения - PullRequest
1 голос
/ 03 декабря 2008

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

// Найти любое значение года, начинающееся с скобки или подчеркивания

string patternToFind = "[[_]2007";

Regex yearFind = new Regex(patternToFind);

// Я хочу изменить любое из этих значений на x2008, где x - это скобка или подчеркивание, изначально в тексте. Я пытался использовать Regex.Replace (), но не могу понять, можно ли его применить.

Если ничего не помогает, я могу найти совпадения, используя MatchCollection, а затем переключить значение 2007 на 2008; однако я надеюсь на что-то более элегантное

MatchCollections matches = yearFind.Matches(" 2007 [2007 _2007");
foreach (Match match in matches){
  //use match to find and replace value
}

Ответы [ 3 ]

5 голосов
/ 03 декабря 2008

Ваш шаблон работает не так, как описано: как описано, вам нужно начать с "\[|_" (труба означает ИЛИ), и решение вашей реальной проблемы - регулярное выражение . Оберните интересующую вас часть шаблона в скобки "(" и ")", и вы можете получить к ним доступ в заменителе.

Следовательно, вам нужен такой шаблон: /^(\[|_)2007/

изменить: код .NET

string s = Regex.Replace(source, @"^(\[|_)2007", @"$12008");

n.b. неправильно понял требование, образец исправлен

2 голосов
/ 03 декабря 2008

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

Regex yearFind = new Regex("([[_])2007");
yearFine.Replace("_2007", @"$12008"); // => "_2008"
yearFine.Replace("[2007", @"$12008"); // => "[2008"

"$ 1" в тексте замены заменяется тем, что было найдено в скобках.

1 голос
/ 03 декабря 2008

Чтобы показать подстановку (в данном случае используется vim). если у меня есть файл со следующим содержанием:

aaa _2007
bbb , 2007
ccc [2007]

и я использую регулярное выражение

:1,$ s/\([_[ ]\)\(2007\)/\12008/g

Первая группа (в (,)) будет соответствовать символу, предшествующему году, а вторая группа - 2007 году. Подстановка заменяет первый матч и перезаписывает все, что было сопоставлено второй группой с 2008, давая:

aaa _2008
bbb , 2008
ccc [2008]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...