Регулярно ищите приведение в стиле C и заменяйте static_cast для C ++ в Notepad ++ - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь найти приведения в стиле C (int) (float) и т. Д., А также найти и заменить их на std::static_cast, но у меня возникают трудности с группами захвата Regex.

Пример кода:
Point pt((int)(it.size*cn), 1);

Следует заменить на:
Point pt(std::static_cast<int>((it.size*cn)), 1);

Следующее регулярное выражение соответствует шаблону:
(\(int\))\([^ ]*\)

Когда я пытаюсь заменить совпадение навторая группа захвата (независимо от того, что кастуется), она заменяет все.

Результат, который я получаю:
Point pt(std::static_cast<int>((int)(it.size*cn)), 1);
Использование замены на:
std::static_cast<int>\($0\)

Регулярное выражение не должно выводить тип, я просто ищу int.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Нулевой индекс - это полное соответствие регулярному выражению. Ваши две группы захвата имеют индексы 1 и 2. Попробуйте что-то вроде std::static_cast<$1>\($2\).

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

0 голосов
/ 22 мая 2019

Вы можете использовать

Найти что : \(int\)\(([^()]*)\)
Заменить на : std::static_cast<int>\(\($1\)\)

Краткое описание

  • \(int\)\( - соответствует буквально (int)(
  • ([^()]*) - захватывает в группу 1 любые ноль или более символов, кроме ( и )
  • \) - совпадения ).

График регулярных выражений :

enter image description here

См. Скриншот Notepad ++ с настройками и демонстрацией:

enter image description here

0 голосов
/ 17 мая 2019

Попробуйте использовать это регулярное выражение вместо: \((int)\)\s*(\([^\)]*\))

Со строкой замены: std::static_cast<$1>$2

LIVE DEMO

Обратите внимание, что использование регулярного выражения дляэта задача, как правило, неосуществима, поскольку регулярное выражение не может быть использовано для правильного синтаксического анализа синтаксиса C.

...