在 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
以确保正则表达式应用于所有内容;否则它只会匹配一次,在这种情况下会产生将文件名中的第一个字符大写然后停止的效果。
我正在尝试为 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
以确保正则表达式应用于所有内容;否则它只会匹配一次,在这种情况下会产生将文件名中的第一个字符大写然后停止的效果。