1

我在排除 VSCode Snippet 中的部分字符串时遇到问题。本质上,我想要的是一条特定的路径,但我无法让正则表达式排除我需要排除的内容。

我最近问了一个关于类似问题的问题,您可以在这里找到:除了使用 TM_FILENAME_BASE 之外,有没有办法修剪 TM_FILENAME?

正如你所看到的,我主要被代码片段在 vscode 中的工作方式所困扰,而不是正则表达式本身

${TM_FILEPATH/(?<=area)(.+)(?=state)/${1:/pascalcase}/}

给定一个看起来像的文件路径abc/123/area/my-folder/state/...

预期的:

/MyFolder/

实际的:

abc/123/areaMyFolderstate/...
4

3 回答 3

1

您需要匹配整个字符串来实现:

"${TM_FILEPATH/.*area(\\/.*?\\/)state.*/${1:/pascalcase}/}"

查看正则表达式演示

细节

  • .*- 除换行符以外的任何 0+ 个字符,尽可能多
  • area- 一个单词 - (\\/.*?\\/)- Group 1: /,除换行符之外的任何 0+ 字符,尽可能少,以及/ - state.*-state子字符串和该行的其余部分。

注意area:如果and之间必须没有其他子部分,请state替换.*?[^\\/]*or even [^\\/]+

于 2019-07-03T15:34:39.223 回答
0

基于您在问题中链接到的我的答案,请记住,环顾四周是“零长度断言”和“不使用字符串中的字符”。请参阅环视是零长度断言

Lookahead 和lookbehind,统称为“lookaround”,是零长度断言,就像本教程前面解释的行的开始和结束,以及单词锚的开始和结束。不同之处在于环视实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不消耗字符串中的字符,而只是断言匹配是否可能。

因此,在您的代码片段转换中:/(?<=area)(.+)(?=state)/环视部分实际上并未被消耗,因此只是通过。Vscode 将它们视为实际上根本不在“要转换的部分”段内。

这就是为什么不会将环视排除在转换之外的原因。

于 2019-07-03T17:06:36.297 回答
0

预期输出似乎与输入中的部分字符串不同。如果需要,表达式可能会非常复杂,例如:

(?:[\s\S].*?)(?<=area\/)([^-])([^-]*)(-)([^\/])([^\/]*).*

并替换类似的东西/\U$1\E$2$3\U$4\E$5/(如果有的话)。

演示 1

如果还有其他操作,现在我猜可能pascalcase会做一些事情,这个简单的表达式可能在这里简单地工作:

.*area(\\/.*?\\/).*

并且所需的数据在此捕获组中$1

(\\/.*?\\/)

演示 2

于 2019-07-03T15:40:21.750 回答