#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