Вопрос по регулярному выражению Visual Studio

#c# #regex #visual-studio

#c# #регулярное выражение #visual-studio

Вопрос:

Я хочу заменить все ссылки на файл ресурсов в моем коде C #.

Примером может служить страница, содержащая несколько ссылок, таких как:

 Resources.Global.Firstname  
Resources.Global.Surname
  

Я бы хотел, чтобы регулярное выражение находило все эти (они могли заканчиваться либо на ; , либо на ) ).

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

Комментарии:

1. Зачем вам нужно регулярное выражение? Вы не можете просто щелкнуть правой кнопкой мыши по определению свойства и выбрать «Найти все ссылки»?

2. Вы имеете в виду диалоговое окно поиска и замены Visual Studio?

3. Будет ли Рефакторинг-> Переименовать работать в вашем случае?

4. Существует около 800 страниц, каждая из которых содержит потенциально 1100 различных ссылок на ресурс, поэтому вместо того, чтобы просматривать каждую из них вручную, было бы проще написать приложение, которое их заменяет.

5. Рефакторинг не сработает, поскольку он говорит о том, что потребляющая сторона кода изменяет способ получения данных. Он не говорит о переименовании одного свойства или метода в другой; смотрите комментарий к моему вопросу.

Ответ №1:

Вы можете просто использовать окно поиска и замены в Visual Studio.

  1. Нажмите Ctrl-H, чтобы открыть окно.
  2. Поместите Resources.Global.{[^,) ;] } в текстовое поле «Найти что:».
  3. Поместите GetStringValue("1") в текстовое поле «Заменить на:».
  4. Убедитесь, что в раскрывающемся списке «Искать в:» указана область, в которой вы хотите выполнить поиск
  5. Разверните подпанель «Параметры поиска».
  6. Установите флажок рядом с «Использовать:» и убедитесь, что выбрано «Регулярные выражения».

Что это делает:

Первое регулярное выражение найдет все, что начинается с Resources.Global. , и захватит все, что находится после него, пока не найдет пробел, запятую, близкий знак равенства или точку с запятой.

Второй заменяет весь найденный текст на GetStringValue("") и помещает захваченный текст внутри кавычек в круглых скобках.

Комментарии:

1. Блестяще, никогда не знал, что вы можете это сделать. Большое спасибо

Ответ №2:

Почему бы просто не использовать CTRL H (быстрый поиск и замена) и выполнять поиск по фактическим терминам, а не по шаблону регулярных выражений? Что вы пытаетесь переименовать из и в?

ОБНОВИТЬ шаблон, чтобы он соответствовал, было бы что-то вроде: Ресурсы.Глобальный.([^};] )

Шаблон замены будет GetStringValue(» 1″)

Комментарии:

1. В принципе, каждая ссылка (ресурс. Глобальный.*) необходимо заменить на GetStringValue(«*»), поскольку мы переходим от файлов ресурсов к решению для базы данных.

2. хорошо, итак, в вашем примере вызов будет осуществляться из (например): Resources. Глобальный. Имя для получения stringValue(«Firstname»)?

3. Это совершенно верно. В глобальном ресурсе имеется около 1100 различных записей ресурсов, поэтому просмотр всех и переименование их является трудоемким процессом. Другим способом было бы создать утилиту, которая соответствовала бы регулярному выражению, и заменить текст значением GetStringValue(«*»)

4. кей, обновил мой ответ для тебя. Обратите внимание, что я оставил комментарий CTRL H там, чтобы вы могли применять замены регулярных выражений с помощью диалогового окна быстрой замены в VS.

5. разве вам не понадобился бы какой-нибудь квантификатор внутри группы захвата?

Ответ №3:

Как сказал Блейзес, в упомянутом вами сценарии фактическим ответом является рефакторинг. Если вы просто хотите их просмотреть, щелкните правой кнопкой мыши на определении и выберите Найти все ссылки. Если вы хотите изменить это, просто внесите изменения, а затем нажмите ctrl shift F11, появится контекстное меню, которое дает вам возможность переименовать все ссылки.

Ответ №4:

Регулярное выражение:

 (Resources.Global.[A-Z][a-zA-Z]*[;)])
  

найдет только последние две строки из следующих протестированных строк:

 Resources.Global.Firstname  
Resources.Global.Surname
Resources.Global.Firstname;  
Resources.Global.Surname)
  

используемый код для проверки:

 Regex regex = new Regex(@"(Resources.Global.[A-Z][a-zA-Z]*[;)])");
MatchCollection mc = regex.Matches("Resources.Global.Firstnamen"   
    "Resources.Global.Surname"   
    "Resources.Global.Firstname;"   
    "Resources.Global.Surname)");

foreach (Match match in mc)
{
    Console.WriteLine(match.Groups[1].ToString());
}
  

Это программное обеспечение может помочь вам:

Разработчик регулярных выражений Rad Software

Комментарии:

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

2. @Paul ты прав, но (по крайней мере, для меня) это было неясно из его первоначального вопроса. На самом деле, даже не было ясно, что он хочет провести рефакторинг вещей. Мой ответ в значительной степени устарел из-за такого поворота событий