Переключение позиции строки с помощью регулярного выражения (RegEx) в Notepad ++ - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующий шаблон в 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++.

Так что мне нужно что-то, чтобы захватить следующие элементы:

  1. double CC[ <dontCare> ] - что-то, начинающееся с буквы (не для захвата начала строки, которая является либо табуляцией или пробелы), пока не увидит __declspec (Запомните пробел до __declspec).
  2. То, что начинается с __declspec и заканчивается )).
  3. Все после )) до и включая ;.

Затем я хочу расположить их в правильном порядке: <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 .

1 Ответ

1 голос
/ 04 мая 2020

Посмотрите на это регулярное выражение и посмотрите, работает ли оно у вас?

\b(.*?)(\s__declspec.+?\)\))(.*?;)

https://regex101.com/r/xzUcAt/6

  • Первая группа собирает объявление двойника, включая все, что находится внутри его квадратных скобок. Например: double CC[16]

  • Вторая группа собирает от __declspec до и включая обе закрывающие скобки )), пример: __declspec(align(64)) (обратите внимание, что она собирает пробел до __declspec тоже)

  • Третья группа собирает все после этих двух заключительных скобок вплоть до точки с запятой ;. Например: = {0};

Использование функции замены Regex101 на: $2 $1$3 это приводит к тому, что вы запрашиваете.

Дайте мне знать, помогло ли это или если что-то требует объяснения.

Примечание: Конечное регулярное выражение, которое использовалось OP, было:

\b(.+?)\s(__declspec.+?\)\))(.*?;)
...