在 sublime text 3 片段中应用 2 个正则表达式操作

Applying 2 regex operation in sublime text 3 snippet

我正在尝试为 sublime text 3 制作一个片段,我想将文件名变量 (TM_FILENAME) 转换为大写并将“.c”替换为“_H”。 我有做这件事的表情,但不是同时做。

我试过将它们并排放置,但没用。

我手头的snippet文件内容:

#ifndef ${1:${TM_FILENAME/\..+$/_H/}}
# define ${1:${TM_FILENAME}}
${1/(.*)/\U/\E}
[=10=]

#endif

文件名为test.c,结果如下:

#ifndef test_H
# define test_H
TEST_H


#endif

第三行是我想要的,但我想要它在 ifndef 和 define 之后。
所以我需要将第三行的正则表达式与第一行结合起来。

正如@keith-hall 在对您的问题的评论中提到的,这可以通过利用 Sublime 使用 boost regex syntax for matching and boost format strings 创建替换文本这一事实来实现。

这暴露的一个特征是替换文本中的条件表达式的想法:

The character '?' begins a conditional expression, the general form is:

?Ntrue-expression:false-expression

where N is decimal digit.

If sub-expression N was matched, then true-expression is evaluated and sent to output, otherwise false-expression is evaluated and sent to output.

这意味着对于您在正则表达式中包含的每个捕获组,您可以将应替换的内容指定为两个单独的文本项;组捕获一些文本时的替换文本和未捕获文本时的替换文本。

基于您上述问题的示例如下:

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

此处的正则表达式部分是 (\.c)|(.),它匹配文字文本 .c(第 1 组)或任何单个字符(第 2 组)。

在替换文本中,(?1_H:)表示如果第一个捕获组捕获了任何文本,则替换它的应该是文字文本_H;否则替换文本应为空字符串。

接下来,(?2\u:) 说如果捕获组 2 捕获任何内容,替换文本应该是该字符的大写版本;否则替换应该是一个空字符串。

由于输入的正则表达式有一个交替(| 字符),正则表达式匹配一个或另一个;所以在替换文本中只有一组或另一组中有任何文本,输出会相应地起作用。

正则表达式中的选项指定g以确保正则表达式应用于所有内容;否则它只会匹配一次,在这种情况下会产生将文件名中的第一个字符大写然后停止的效果。