【问题标题】:Applying 2 regex operation in sublime text 3 snippet在崇高文本 3 片段中应用 2 正则表达式操作
【发布时间】:2019-11-05 05:58:20
【问题描述】:

我正在尝试为 sublime text 3 创建一个 sn-p,我想将文件名变量 (TM_FILENAME) 转换为大写并将“.c”替换为“_H”。 我有表达方式,但不是同时。

我曾尝试将它们放在一起,但没有成功。

我拥有的sn-p文件内容:

#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 之后。
所以我需要将第三行的正则表达式与第一行结合起来。

【问题讨论】:

标签: regex sublimetext3 sublimetext-snippet


【解决方案1】:

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

其中一个功能是替换文本中的条件表达式的概念:

字符“?”开始一个条件表达式,一般形式是:

?Ntrue-expression:false-expression

其中 N 是十进制数字。

如果子表达式 N 匹配,则计算 true-expression 并将其发送到输出,否则计算 false-expression 并将其发送到输出。

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

基于您上述问题的一个例子是这样的:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多