我已经在这个崇高片段上停留了一段时间了。
我想在使用 TM_FILEPATH
和 TM_FILENAME
创建新类时显示正确的包名称。
打印TM_FILEPATH
变量时,我得到如下内容:
/Users/caubry/d/[...]/src/com/[...]/folder/MyClass.as
我想转换此输出,以便我可以得到类似以下内容:
com.[...].folder
这包括:
- 在
/com/[...]/folder/MyClass.as
之前删除任何内容; - 删除TM_FILENAME及其扩展名;在本例中
MyClass.as
; - 最后找到所有的斜杠并用点替换它们。
到目前为止,这就是我得到的:
${1:${TM_FILEPATH/.+(?:src/)(.+).w+/l$1/}}
这将显示:
com/[...]/folder/MyClass
我确实了解如何用点代替飞溅,例如:
${1:${TM_FILEPATH///./g/}}
但是,我很难将此逻辑添加到前一个逻辑中,以及删除逻辑末尾的TM_FILENAME。
我对正则表达式真的没有经验,提前谢谢。
:]
编辑:[...]
表示文件夹数量可变。
我们可以通过一些技巧在一次替换中做到这一点。我们要做的是,我们将几个不同的案例放入我们的模式中,并对每个案例进行不同的替换。实现此目的的诀窍是替换字符串不得包含文字字符,但完全由"反向引用"组成。在这种情况下,那些没有参加比赛的小组(因为他们是不同情况的一部分)将简单地写回一个空字符串,而不是为替换做出贡献。让我们开始吧。
首先,我们希望删除最后一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 正则表达式引擎的在线测试器。但这应该可以很好地解决问题。