Как представить имя функции C в регулярном выражении?

#c #regex #visual-studio

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

Вопрос:

Я хочу изменить все функции в проекте следующим образом.

 void Enemy::Create(int asdf, int asdf, float asdf)
{
}
  

->

 void Enemy::Create(int asdf, int asdf, float asdf)
{CCLOG("ERROR OCCURED");
}
  

И следующий код является другим примером.

 void Enemy::Change()
{

}
  

->

 void Enemy::Change()
{CCLOG("ERROR OCCURED");

}
  

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

(Поддержка Visual Studio заменяет код обычным выражением)

Но я не знаком с регулярным выражением, поэтому понятия не имею, что это такое.

Как я могу изменить все функции в проекте верхним способом?

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

1. Все ли функции, нуждающиеся в изменении, в классе Enemy ?

2. Я сомневаюсь, что ошибка произошла во вражеском классе. Но моя цель — отладить некоторую ошибку, возникающую при переносе на мобильные устройства. В Visual Studio проект выполняется хорошо, но при переносе eclipse и Android мое приложение внезапно останавливается.

Ответ №1:

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

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

Вы можете представить это примерно так —

 void Enemy::Create(int asdf, int asdf, float asdf) {
  

Обобщенный как

 <Identifier><Whitespace><Identifier>::<Identifier>(<Anthing>)<Whitespace>{
  

В C за идентификатором _ или A-Z следует ноль или больше _ , A-Z или 0-9 . С учетом сказанного —

 <Identifier> = [a-zA-Z_][a-zA-Z0-9_]*
<Whitespace> = [nrs] 
  <Anything> = .*
  

Итак, выражение должно выглядеть примерно так

 ([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($1)
([nrs] )              # <Whitespace> ($2)
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($3)
::                       # ::         
([a-zA-Z_][a-zA-Z0-9_]*) # <Identifier> ($4)
(                       # (
(.*)                     # <Anything>   ($5)
)                       # )
([nrs] )              # <Whitespace> ($6)
{                       # {
  

Но Visual Studio не поддерживает многострочный поиск, поэтому используйте это

 ([a-zA-Z_][a-zA-Z0-9_]*)([nrs] )([a-zA-Z_][a-zA-Z0-9_]*)::([a-zA-Z_][a-zA-Z0-9_]*)((.*))([nrs] ){
  

И для замены вам придется реконструировать выражение с помощью групп захвата, перечисленных выше. Вот куда вы вставите свое CCLOG .

 $1$2$3::$4($5)n{CCLOG("ERROR OCCURED"); 
  

Обратите внимание, что это довольно грубо и должно использоваться только для чего-то быстрого и грязного, например, для рефакторинга вашего кода в Visual Studio. Он не будет обрабатывать другие случаи, такие как списки инициализации конструктора, throw, const, noexcept и т.д. Но вы можете использовать те же концепции, чтобы написать выражение для его обработки.

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

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

2. Спасибо за пошаговое решение

3. @jong-hyunYeo Если это решило вашу проблему, не забудьте согласиться.

4. @Jonathan Mee Спасибо, что упомянул об этом.

5. @Austin Brunkhorst