2013-10-04 4 views
1

Вот простой примерRegex.Replace удаляет « г» символ в « г п»

string text = "parameter=120\r\n"; 
int newValue = 250; 

text = Regex.Replace(text, @"(?<=parameter\s*=).*", newValue.ToString()); 

text будет "parameter=250\n" после замены. Метод Replace() удаляет '\ r'. Использует ли он стиль unix для линейного фида по умолчанию? Добавление \b к моему регулярному выражению (?<=parameter\s*=).*\b решает проблему, но я полагаю, что должен быть лучший способ разбора строк с помощью строк строки в стиле окна.

ответ

1

Посмотрите на this answer. Короче говоря, период (.) соответствует любому символу, кроме \n, в почти всех реализациях регулярных выражений. В частности, это не относится к замене - вы сказали, чтобы удалить любое количество ., и это также приведет к увеличению \r.

Невозможно протестировать сейчас, но вы можете переписать его как (?<=parameter\s*=)[^\r\n]*, чтобы явно указать, какие символы вы хотите запретить.

1

. по умолчанию не соответствует \n ..если вы хотите, чтобы соответствовать вы должны использовать режим одиночной линии ..

(?s)(?<=parameter\s*=).* 
^ 

(?s) будет переключать режим одиночной линии

1

Попробуйте это:

string text = "parameter=120\r\n"; 
int newValue = 250; 

text = Regex.Replace(text, @"(parameter\s*=).*\r\n", "${1}" + newValue.ToString() + "\n"); 

Окончательная стоимость text:

параметр = 250 \ п

Match возврата каретки и перевода строки в явном виде. Будет соответствовать только строки, заканчивающиеся на \r\n.

+0

Ваш пример не будет работать на .Net (он выглядит как php или perl), но регулярное выражение с '\ r \ n' отлично работает ' text = Regex.Replace (text, @ "(? <= Parameter \ s * =). * (? = \ r \ n) ", newValue.ToString()); ' – Max

+0

@Max вы попробовали? Отлично работает для меня в .net 4.0 и .net 4.5. Я предполагаю, что синтаксис jarring - это $ {1} - он вставляет обратно ссылку из шаблона в строку замены. – Gusdor

+0

Да, я попробовал. В результате получается '$ 1250 \ n" '. Да, $ {1} смутил меня :). – Max

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