我正在使用变量转换在VS代码中编写一个片段。我想用一个变量来替换某些文本中出现的模式(在本例中是复制到剪贴板上的文本(,该变量插入不带扩展名的文件名(例如:CurrentFileNameWithoutExtensions(。发生的情况是,模式被替换为字符串形式的变量名,而不是变量的值。
以下是片段:
"${CLIPBOARD/pattern/$TM_FILENAME_BASE/}"
输出是:";图案";变成"$TM_FILENAME_BASE">
正确的输出应该是:"图案";变成";CurrentFileNameWithoutExtensions";。
一个可能的解决方案是输出模式之前的所有剪贴板文本,然后输出变量,最后输出模式之后的所有剪贴板文字。如何做到这一点?
剪贴板文本示例:
Text that is before pattern in clipboard.
pattern
Text that is after pattern in clipboard.
该片段可以捕获所有文本,直到出现模式并输出:
Text that is before pattern in clipboard.
然后输出变量$TM_FILENAME_BASE
:
CurrentFileNameWithoutExtensions
最后,它会输出模式后的文本:
Text that is after pattern in clipboard.
输出看起来像这样放在一起:
Text that is before pattern in clipboard.
CurrentFileNameWithoutExtensions
Text that is after pattern in clipboard.
如果总是有一个匹配的模式,那么这是有效的:
"pattern": {
"prefix": "_pt",
"body": [
"${CLIPBOARD/(.*[rn]*)((pattern)([rn]*))(.*)/$1/}$TM_FILENAME_BASE${CLIPBOARD/(.*[rn]*)((pattern)([rn]*))(.*)/$4$5/}"
],
"description": "clipboard pattern"
}
这将处理中任意数量的换行符
first text
pattern
second text
或
first text
pattern
second text
或
first textpatternsecond text
参见regex101演示
当然,正如rioV8所指出的,如果模式在文本中除了中间部分之外的某个地方也匹配,那就是一个问题。
分组捕获不同的零件,只输出您想要的组
如果pattern
不是CLIPBOARD 的一部分,它也可以工作
"${CLIPBOARD/^((.*?)(pattern.*)|(.*))$/$2$4/}$TM_FILENAME_BASE${CLIPBOARD/^((.*?pattern)(.*)|(.*))$/$3/}"