Разделить длинное регулярное выражение в файле формата .clang

Я использую формат clang для сортировки и группировки включаемых файлов. По какой-то устаревшей причине я должен использовать достаточно длинное регулярное выражение в разделе IncludeCategories. Варианты стиля описаны здесь.

IncludeCategories:
  - Regex:           '^"(very|long|regex|pattern|here)/'
    Priority:        2

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

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытались вставить новые строки в нужные места в регулярном выражении?

Я сделал именно так, и это работает в моем случае. Возможно, есть какие-то дополнительные ограничения, и мой пример был достаточно простым, чтобы он работал. Чтобы проверить эту проблему, я скопировал формат .clang из одного из проектов с открытым исходным кодом на Github и немного изменил его.

Исходный .clang-формат:

IncludeCategories:
  - Regex:           '^("boost/first.hpp")'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^("boost/second.hpp")'
    Priority:        2
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^<(algorithm|any|array|atomic|barrier|bit|bitset|cassert|cctype|cerrno|cfenv|cfloat|charconv|chrono|cinttypes|climits|clocale|cmath|codecvt|compare|complex|concepts|condition_variable|coroutine|csetjmp|csignal|cstdarg|cstddef|cstdint|cstdio|cstdlib|cstring|ctime|cuchar|cwchar|cwctype|deque|exception|execution|filesystem|format|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|latch|limits|list|locale|map|memory|memory_resource|mutex|new|numbers|numeric|optional|ostream|queue|random|ranges|ratio|regex|scoped_allocator|semaphore|set|shared_mutex|source_location|span|sstream|stack|stdexcept|stop_token|streambuf|string|string_view|strstream|syncstream|system_error|thread|tuple|typeindex|typeinfo|type_traits|unordered_map|unordered_set|utility|valarray|variant|vector|version)>'
    Priority:        3
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
    Priority:        4
    SortPriority:    0
    CaseSensitive:   true

Начальный порядок исходного кода:

#include "boost/first.hpp"
#include "boost/second.hpp"
#include <algorithm>
#include <cmath>
#include <codecvt>
#include <cuchar>
#include <fstream>
#include <iosfwd>
#include <iostream>
#include <memory>
#include <random>
#include <streambuf>
#include <string>
#include <thread>
#include <unordered_set>
#include <valarray>
#include <vector>
#include <limits.h>
#include <stddef.h>

Модифицированный .clang-формат. Обратите внимание, что третье регулярное выражение теперь охватывает несколько строк, а его приоритет изменен с 3 на 1. Контуры добавляются как в конец, так и в начало каждой разделенной строки регулярного выражения.

    IncludeCategories:
  - Regex:           '^("boost/first.hpp")'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^("boost/second.hpp")'
    Priority:        2
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^<(algorithm|any|array|atomic|barrier|bit|bitset|cassert|cctype|cerrno|cfenv|cfloat|charconv|chrono|cinttypes|climits|clocale|cmath|
                        |codecvt|compare|complex|concepts|condition_variable|coroutine|csetjmp|csignal|cstdarg|cstddef|cstdint|cstdio|cstdlib|cstring|ctime|
                        |cuchar|cwchar|cwctype|deque|exception|execution|filesystem|format|forward_list|fstream|functional|future|initializer_list|iomanip|ios|
                        |iosfwd|iostream|istream|iterator|latch|limits|list|locale|map|memory|memory_resource|mutex|new|numbers|numeric|optional|ostream|queue|
                        |random|ranges|ratio|regex|scoped_allocator|semaphore|set|shared_mutex|source_location|span|sstream|stack|stdexcept|stop_token|streambuf|
                        |string|string_view|strstream|syncstream|system_error|thread|tuple|typeindex|typeinfo|type_traits|unordered_map|unordered_set|utility|
                        |valarray|variant|vector|version)>'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   true
  - Regex:           '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
    Priority:        4
    SortPriority:    0
    CaseSensitive:   true

Измененный порядок исходного кода. Обратите внимание, что boost/second.hpp был включен после всех включений, которые теперь имеют больший приоритет. Заголовки, которые заканчивают строку (например, cmath и streambuf), а также заголовки, которые начинают новую строку (например, codecvt и iosfwd), упорядочены правильно:

#include "boost/first.hpp"
#include <algorithm>
#include <cmath>
#include <codecvt>
#include <cuchar>
#include <fstream>
#include <iosfwd>
#include <iostream>
#include <memory>
#include <random>
#include <streambuf>
#include <string>
#include <thread>
#include <unordered_set>
#include <valarray>
#include <vector>
#include "boost/second.hpp"
#include <limits.h>
#include <stddef.h>

Вы пробовали сортировать заголовки, которые начинают новую строку? Это codecvt, cuchar, iosfwd, random, string и valarray из вашего измененного файла в формате .clang.

αλεχολυτ 27.11.2022 11:31

Я обновил свой пример, чтобы clang-format форматировал заголовки, которые заканчивают строку регулярного выражения, заголовки, которые начинают новую строку регулярного выражения, и некоторые заголовки между ними.

CleanCoder265 28.11.2022 23:09

Это поведение где-то задокументировано?

αλεχολυτ 28.11.2022 23:59

Не то, что я знаю из. Я сделал обоснованное предположение, что он может работать с этим подходом, основываясь на том, как работает большинство парсеров.

CleanCoder265 29.11.2022 07:02

Не могли бы вы указать, какую версию clang-формата вы использовали?

αλεχολυτ 29.11.2022 11:21

Выход clang-format --version: Ubuntu clang-format version 14.0.0-1ubuntu1

CleanCoder265 29.11.2022 12:36

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

CleanCoder265 30.11.2022 19:35

Другие вопросы по теме