我已经被困在这段崇高的片段上了。
在使用TM_FILEPATH和TM_FILENAME创建新类时,我希望显示正确的包名。
在打印TM_FILEPATH变量时,我得到如下内容:
/Users/caubry/d/[...]/src/com/[...]/folder/MyClass.as
我想转换这个输出,这样我就可以得到如下内容:
com.[...].folder
这包括:
/com/[...]/folder/MyClass.as之前移除任何东西;MyClass.as;到目前为止,我得到的是:
${1:${TM_FILEPATH/.+(?:src\/)(.+)\.\w+/\l$1/}}
这个显示:
com/[...]/folder/MyClass
我明白如何用点代替溅痕,例如:
${1:${TM_FILEPATH/\//./g/}}
但是,我很难将这个逻辑添加到前一个逻辑中,也很难删除逻辑末尾的TM_FILENAME。
我对Regex真的没什么经验,谢谢。
:]
编辑: [...]表示文件夹的可变数量。
发布于 2013-09-09 21:43:28
我们可以用一些诡计来代替这一点。我们要做的是,在我们的模式中加入几种不同的情况,并对每一种情况进行不同的替换。要做到这一点,关键在于替换字符串必须不包含任何文字字符,而是完全由“反向引用”组成。在这种情况下,那些没有参加比赛的组(因为它们是另一种情况的一部分)将被简单地写回空字符串,而不会对替换做出贡献。我们开始吧。
首先,我们希望在最后一个src/之前删除所有内容(为了模仿代码片段的行为-如果您想要删除所有内容直到第一个src/),可以使用一个非贪婪的量词:
^.+/src/我们只想放弃这个,所以没有必要捕捉任何东西,也不需要写任何东西。
现在我们想要匹配后续的文件夹,直到最后一个。我们将捕获文件夹名,也将匹配尾随的/,但返回文件夹名和.。但是我说在替换字符串中没有文字文本!因此,.也必须来自捕获。下面是一个假设,即您的文件总是有一个扩展名。我们可以通过查找从文件名中获取句点。我们还将使用这种前瞻性来确保前面至少还有一个文件夹:
^.+/src/|\G([^/]+)/(?=[^/]+/.*([.]))我们将用$1$2代替这个。现在,如果第一个替代捕获,组$1和$2将为空,并且前导位仍然被删除。如果第二个选项捕获,$1将是文件夹名,$2将捕获一个句点。甜。\G是确保所有匹配项彼此相邻的锚点。
最后,我们将匹配最后一个文件夹及其后面的所有内容,并且只回写文件夹名:
^.+/src/|\G([^/]+)/(?=[^/]+/.*([.]))|\G([^/]+)/[^/]+$现在,我们将用$1$2$3来代替它,作为最终的解决方案。演示。
在概念上类似的一种变体是:
^.+/src/|\G([^/]+)/(?:(?=[^/]+/.*([.]))|[^/]+$)代之以$1$2。我只考虑了第二种和第三种选择的开始。演示。
最后,如果Sublime使用的是Boost的扩展格式字符串语法,那么实际上可以有条件地将字符放入替换中(而不必神奇地从文件扩展名中提取字符):
^.+/src/|\G(/)?([^/]+)|\G/[^/]+$现在,我们有了src之前的第一个选项(将被删除),最后一个斜杠和文件名的第三个选项(将被删除),以及您想要保留的所有文件夹的中间选项。这一次,我把斜杠可选地替换在开头。使用条件替换,我们可以在那里写入一个.当且仅当该斜杠匹配时:
(?1.:)$2不幸的是,我现在不能测试这个,我也不知道一个在线测试器使用Boost的regex引擎。但这应该没什么问题。
https://stackoverflow.com/questions/18707155
复制相似问题