Как упомянул @ 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
, чтобы гарантировать, что регулярное выражение применяется ко всему;в противном случае он будет совпадать только один раз, что в этом случае будет иметь верхний регистр первого символа в имени файла и затем останавливается.