У меня есть следующий шаблон в C
коде:
#if defined (_MSC_VER)
double CC[16] __declspec(align(64)) = {0};
#else
double CC[16] __attribute__ ((aligned (64))) = {0};
#endif
Это ошибка, поскольку она должна быть __declspec(align(64)) double CC[16] = {0};
.
Я хотел бы исправить ее во многих файлах используя регулярное выражение. Я был бы рад, если бы выражения были в формате, совместимом с Notepad++
.
Так что мне нужно что-то, чтобы захватить следующие элементы:
double CC[ <dontCare> ]
- что-то, начинающееся с буквы (не для захвата начала строки, которая является либо табуляцией или пробелы), пока не увидит __declspec
(Запомните пробел до __declspec
). - То, что начинается с
__declspec
и заканчивается ))
. - Все после
))
до и включая ;
.
Затем я хочу расположить их в правильном порядке: <2nd Item> <1st Item><3rd Item>
(Минус пробел между 1-м пунктом и 2-е).
Решение должно быть надежным, так как иногда дело обстоит так:
#if defined (_MSC_VER) && !defined(__clang__)
double pU[3*4*K_MAX_STACK] __declspec(align(64));
#else
double pU[3*4*K_MAX_STACK] __attribute__ ((aligned (64)));
#endif
Я пробовал что-то на https://regex101.com/r/xzUcAt/1 с небольшим (нет!) успехом .
Примечание : я столкнулся с этим с Я обнаружил ошибку в BLASFeo (Библиотека BLAS с открытым исходным кодом для небольших матриц), которую я хочу Помощь в решении.
Решение
На основании ответа @ CasNouwens , который выполнил 99% работы, которую я придумал:
\b(.*?])\s(__declspec.+?\)\))(.*?;)
Решение доступно на https://regex101.com/r/xzUcAt/10.
\b
- захватывает все до начала нового слова. (.*?])
- захватывает любое символ до первого ]
. Сохраните его как $1
. \s
- захватывает любые пробелы или любые Пробелы (Tabs, et c ...). (__declspec.+?\)\))
- захватывает любой набор символов, который начинается с __declspec
и заканчивается первым ))
. Сохраните его как $2
. (.*?;)
- захватывает все ( Пробелы включены) до первого ;
. Сохраняет как $3
.
Новая строка задается как $2 $1$3
.
Это также отлично работает с grepWin .