2012-06-27 4 views
1

У меня есть 100 файлов, в которых мне нужно заменить:.Регулярное выражение для замены строки

  1. Eval ("что-то") с Eval ("что-то") ToEncodedString()
  2. Eval ("что-то ») .ToString() с Eval (« что-то »). ToEncodedString()

Я пишу небольшое приложение на C#, которое может автоматизировать это. Но не удалось сформировать регулярное выражение. Кто-нибудь поможет мне, пожалуйста?

+5

Почему бы не открыть эти файлы в Notepad ++ и Заменить текст там его применения для всех открытых файлов –

+0

Строка в кавычках может быть что угодно. Поэтому мне нужно использовать регулярное выражение. Если я использую TextPad, каково будет выражение регулярного выражения поиска и термин регулярного выражения замены? – droidbot

+1

Вы что-то пробовали? Показ http://whathaveyoutried.com заставляет людей видеть, что вы пробовали, и что вы не отвечаете на «код для меня/бесплатно». – rcdmk

ответ

1

Вы можете использовать этот шаблон: @"\bEval\(""(?<Value>.+?)""\)(?:\.ToString\(\))?"

Разбивка:

  • \bEval: сопоставить слово-граничное, чтобы мы сопрягать «Eval» как целое слово, а не как часть другого слова
  • \("": буквенная открывающая скобка и двойные кавычки (двойные кавычки появляются дважды, так как они экранируются при использовании строкового литерала, то есть символа @, предшествующего строке)
  • (?<Value>.+?): названо захват группа «Value», которая не является жадным матчем любого персонажа (остановятся на двойных кавычках)
  • ""\): закрытие двойных кавычек и закрывающей скобки
  • (?:\.ToString\(\))?: чем (?:...) бит является не- захватив группу, то мы сопоставляем .ToString() буквально с соответствующим побега, а окончательный ? делает эту группу дополнительно

Схема замены @"Eval(""${Value}"").ToEncodedString()", который легко понять. Важная часть состоит в том, что названная группа захвата «Значение» ссылается на ${Value}.

Пример кода:

string[] inputs = 
{ 
    @"Eval(""something"")", 
    @"Eval(""hello"").ToString()" 
}; 

string pattern = @"\bEval\(""(?<Value>.+?)""\)(?:\.ToString\(\))?"; 
string replacement = @"Eval(""${Value}"").ToEncodedString()"; 

foreach (var input in inputs) 
{ 
    Console.WriteLine(Regex.Replace(input, pattern, replacement)); 
} 
+0

выглядит хорошо, но я не совсем уверен, где вы получили этот двойной котировочный бит из ... – Nevyn

+0

@Nevyn при использовании [verbatim string literal] (http://msdn.microsoft.com/en-us/library/ 362314fe.aspx) (т. Е. Символ @, предшествующий строке), вы можете избежать двойных кавычек, используя их дважды. Без дословного строкового литерала вы избежите двойных кавычек с обратным слэшем как '\ 'hello \" ', но с ними это" "" привет "".Чтобы прояснить, почему я использую их для начала, это упрощает использование escape-последовательностей, а не удваивание в обратных косых чертах, и регулярное выражение имеет тенденцию иметь много обратных косых черт для метасимволов. –

+0

ОК, это действительно имеет смысл. Не знал, что ты можешь это сделать. Выглядит странно :-) – Nevyn

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