Применение 2 операций регулярных выражений в возвышенном тексте 3 фрагмента

Я пытаюсь сделать фрагмент для возвышенного текста 3, я хочу преобразовать переменную имени файла (TM_FILENAME) в верхний регистр и заменить «.c» на «_H». У меня есть выражения, чтобы сделать это, но не в то же время.

Я пытался поставить их рядом друг с другом, но это не сработало.

Содержимое файла фрагмента, который у меня есть:

#ifndef ${1:${TM_FILENAME/\..+$/_H/}}
# define ${1:${TM_FILENAME}}
${1/(.*)/\U$1/\E}
$0

#endif

С именем файла test.c результат будет таким:

#ifndef test_H
# define test_H
TEST_H


#endif

Третья строка - это то, что мне нужно, но я хочу, чтобы она была после ifndef и define.
Поэтому мне нужно объединить регулярное выражение третьей строки с первым.


person PsychoPatate    schedule 04.11.2019    source источник
comment
похоже, вы на правильном пути - может помочь мой ответ на аналогичный вопрос: stackoverflow.com/a/46723810/4473405   -  person Keith Hall    schedule 04.11.2019


Ответы (1)


Как было упомянуто @keith-hall в комментарии к вашему вопросу, это возможно, если воспользоваться тем фактом, что Sublime использует повысить синтаксис регулярного выражения для сопоставления и усилить строки форматирования, чтобы создать замещающий текст.

Одной из особенностей, которые это раскрывает, является идея условного выражения в замещающем тексте:

Персонаж '?' начинается условное выражение, общая форма:

?Ntrue-expression:false-expression

где N - десятичная цифра.

Если совпало подвыражение N, то оценивается истинное выражение и отправляется на выход, в противном случае оценивается ложное выражение и отправляется на выход.

Это означает, что для каждой группы захвата, которую вы включаете в свое регулярное выражение, вы можете указать, что следует заменить, в виде двух отдельных текстовых элементов; заменяющий текст, когда группа захватила какой-то текст, и заменяющий текст, когда это не так.

Пример этого, основанный на вашем вопросе выше, таков:

${1:${TM_FILENAME/(\.c)|(.)/(?1_H:)(?2\u$2:)/g}}

Частью регулярного выражения здесь является (\.c)|(.), которая соответствует либо буквальному тексту .c (группа 1), либо, альтернативно, любому одиночному символу (группа 2).

В тексте замены (?1_H:) говорится, что если первая группа захвата захватила какой-либо текст, заменой для него должен быть буквальный текст _H; в противном случае текст замены должен быть пустой строкой.

После этого (?2\u$2:) говорит, что если группа захвата 2 захватила что-либо, текст замены должен быть версией символа в верхнем регистре; в противном случае замена должна быть пустой строкой.

Поскольку входное регулярное выражение имеет чередование (символ |), регулярное выражение соответствует либо одному, либо другому; таким образом, в замещающем тексте только одна или другая группа содержит какой-либо текст, и выходные данные действуют соответственно.

Параметры в регулярном выражении указывают g, чтобы убедиться, что регулярное выражение применяется ко всему; в противном случае он будет совпадать только один раз, что в этом случае приведет к переводу первого символа в верхний регистр в имя файла и последующей остановке.

person OdatNurd    schedule 04.11.2019