2013-06-21 5 views
7

Мне нужно заменить строку, где она следует за определенной строкой и некоторыми переменными данными. Мне нужно сохранить начало и середину и просто заменить конец. Когда я попробовал код ниже, он заменяет только последнее событие. Я попытался переключиться на не жадный матч, но тогда он его не найдет. Середина может содержать новые строки, а также пробелы, буквы и цифры.Regex заменить все вхождения

String s = "Beginning of story. Keep this sentence. Old ending.\n"; 
s += s; 
s += s; 
s1 = Regex.Replace(s, @"Beginning of story. ([\s\S]*) Old ending.", "Beginning of story. " + @"$1" + " New ending.", RegexOptions.Multiline | RegexOptions.IgnoreCase); 

The result is this: 
Beginning of story. Keep this sentence. Old ending. 
Beginning of story. Keep this sentence. Old ending. 
Beginning of story. Keep this sentence. Old ending. 
Beginning of story. Keep this sentence. New ending. 

Как заменить каждое возникновение «старого окончания».

+0

Попробуйте добавить '' '' в конце вашего шаблона - должно совпадать с концом каждой строки с учетом опции 'Multiline'. – zimdanen

+0

Связанный: http://stackoverflow.com/q/2301285/785745 –

+0

Нежелательный матч должен позаботиться об этом. Не могли бы вы показать, что вы пробовали? –

ответ

6

Я думаю, что Кендалл наткнулся на связанную ссылку, a non greedy match например.

s1 = Regex.Replace(s, @"Beginning of story. ([\s\S]*?) Old ending.", "Beginning of story. " + @"$1" + " New ending.", RegexOptions.Multiline | RegexOptions.IgnoreCase); 

Должен сделать трюк.

Edit:

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

6

Если все, что вам нужно сделать, это заменить Old ending с New ending, почему бы вам не просто использовать старый добрый string.replace? Будет проще и быстрее, чем с помощью регулярных выражений

String s = "Beginning of story. Keep this sentence. Old ending.\n"; 
s.Replace("Old ending", "New ending"); 

Update: Чтобы заменить Old ending везде, где она предшествует Begining of story... затем использовать это регулярное выражение (?<=Beginning of story.*?)Old ending, поиграйте с этим, если у вас есть небольшие изменения, но это должно вас там

Regex.Replace(s, @"(?<=Beginning of story.*?)Old ending", "New ending"); 

в основном это говорит, найти и заменить «Старый окончание» с «Новое окончание», но только если он начинается с «Начало истории бла-бла-бла»

+1

Я только хочу заменить «старый конец», где это происходит после «Начала истории». Если это произошло за пределами этого шаблона, я не хочу его заменять. – BrianK

+0

@BrianK см. Обновленный ответ, узор, который я предоставил, должен делать трюк – Jason