我在排除VSCode代码段中的字符串部分时遇到问题。本质上,我想要的是路径的特定部分,但是我无法获得正则表达式来排除需要排除的内容。
我最近问了一个类似的问题,您可以在这里找到:Is there a way to trim a TM_FILENAME beyond using TM_FILENAME_BASE?
如您所见,我主要是因为片段在vscode中的工作方式而已,而不是正则表达式本身
${TM_FILEPATH/(?<=area)(.+)(?=state)/${1:/pascalcase}/}
给出一个看起来像abc/123/area/my-folder/state/...
预期:
/MyFolder/
实际:
abc/123/areaMyFolderstate/...
答案 0 :(得分:0)
您需要匹配整个字符串以实现以下目标:
"${TM_FILEPATH/.*area(\\/.*?\\/)state.*/${1:/pascalcase}/}"
请参见regex demo
详细信息
.*
-除换行符以外的任意0+个字符,并且尽可能多area
-一个词
-(\\/.*?\\/)
-组1:/
,除换行符以外的任何0+字符(尽可能少)和一个/
-state.*
-state
子字符串和该行的其余部分。 注意:如果area
和state
之间必须没有其他子部分,请将.*?
替换为[^\\/]*
甚至是{{1} }。
答案 1 :(得分:0)
预期的输出似乎与输入中字符串的一部分不同。如果需要的话,表达式可能会非常复杂,例如:
(?:[\s\S].*?)(?<=area\/)([^-])([^-]*)(-)([^\/])([^\/]*).*
,并替换类似/\U$1\E$2$3\U$4\E$5/
的东西(如果有)。
如果还有其他操作,现在我猜想pascalcase
会做些什么,这个简单的表达式可能就可以在这里工作:
.*area(\\/.*?\\/).*
并且所需数据在此捕获组$1
中:
(\\/.*?\\/)
答案 2 :(得分:0)
以您在问题中链接到的答案为基础,请记住,环顾四周是“零长度断言”和“不消耗字符串中的字符”。参见lookarounds are zero-length assertions:
向前看和向后看,统称为“环顾四周”,是零长度的断言,就像在本教程前面介绍的行的开头和结尾以及字锚的开头和结尾一样。区别在于,环顾四周实际上是匹配字符,但随后放弃了匹配,仅返回结果:匹配或不匹配。这就是为什么它们被称为“断言”的原因。它们不使用字符串中的字符,而仅声明是否可以匹配。
因此,在您的代码段转换中:/(?<=area)(.+)(?=state)/
实际上并没有消耗环视部分,因此只需传递它们即可。 Vscode视情况将它们视为实际上根本不在“要转换的部分”部分之内。
这就是为什么不将环视排除在转换之外的原因。