2008-12-03 6 views
1

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

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

string patternToFind = "[[_]2007"; 

Regex yearFind = new Regex(patternToFind); 

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

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

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

ответ

5

Ваш шаблон не работает, как описано: как описано вам нужно начать с «\[|_» (труба означает OR), и решение вашей реальной проблемы regex группировка. Выделите часть шаблона, который вас интересует в скобках "(" и ")", и вы можете получить к ним доступ в замене.

поэтому Вам нужен шаблон, как это: /^(\[|_)2007/

редактировать: .NET код

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

нотабене неверно истолковано требование, изменен образец

+0

Группировка определенно является решением. Это будет ближе к тому, что было предложено: string s = Regex.Replace (source, @ "([\ [_]) 2007", @ "$ 12008"); –

+0

совершенно верно, непонимание - изменено – annakata

1

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

aaa _2007 
bbb , 2007 
ccc [2007] 

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

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

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

aaa _2008 
bbb , 2008 
ccc [2008] 

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

2

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

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

«$ 1» в тексте замены заменяется на все, что было согласовано в круглых скобках.

Смежные вопросы