Применение операции 2 регулярных выражений в возвышенном тексте 3 фрагмента - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь создать фрагмент для возвышенного текста 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и определите.
Так что мне нужно объединить регулярное выражение третьей строки с первой.

1 Ответ

1 голос
/ 05 ноября 2019

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

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

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

?Ntrue-expression:false-expression

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

Если подвыражение N совпало, тогда true-выражениевычисляется и отправляется на выход, иначе ложное выражение вычисляется и отправляется на вывод.

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

Пример, основанный на вашем вопросе, приведенном выше:

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

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

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

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

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

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

...