これは、いくつかのトリックを使用して 1 回の置換で行うことができます。私たちがすることは、いくつかの異なるケースをパターンに入れ、それぞれに異なる置換を行うことです。これを達成する秘訣は、置換文字列にリテラル文字を含めてはならず、完全に「後方参照」で構成することです。その場合、一致に参加しなかったグループ (別のケースの一部であったため) は、単に空の文字列として書き戻され、置換には寄与しません。始めましょう。
まず、最後まですべてを削除しsrc/
ます (スニペットの動作を模倣するため、最初の まですべてを削除する場合は、貪欲でない量指定子を使用しますsrc/
)。
^.+/src/
これを削除したいだけなので、何もキャプチャする必要はなく、何も書き戻す必要もありません。
ここで、最後のフォルダーまで後続のフォルダーを一致させたいと考えています。フォルダー名を取得し、末尾の . も一致させ/
ますが、フォルダー名と.
. しかし、置換文字列にリテラル テキストはないと言いました。したがって、.
もキャプチャから取得する必要があります。ここで、ファイルには常に拡張子があるという仮定が有効になります。先読みでファイル名からピリオドを取得できます。また、その先読みを使用して、少なくとももう 1 つのフォルダーが先にあることを確認します。
^.+/src/|\G([^/]+)/(?=[^/]+/.*([.]))
これを に置き換えます$1$2
。最初の選択肢がキャッチされると、グループ$1
化$2
されて空になり、先頭のビットは引き続き削除されます。2 番目の選択肢がキャッチ$1
する場合、フォルダ名になり$2
、ピリオドがキャプチャされます。甘い。は\G
、すべての一致が互いに隣接していることを保証するアンカーです。
最後に、最後のフォルダーとそれに続くすべてのフォルダーを照合し、フォルダー名のみを書き戻します。
^.+/src/|\G([^/]+)/(?=[^/]+/.*([.]))|\G([^/]+)/[^/]+$
そして、これを$1$2$3
最終的な解決策に置き換えます。デモ。
概念的に類似したバリアントは次のようになります。
^.+/src/|\G([^/]+)/(?:(?=[^/]+/.*([.]))|[^/]+$)
に置き換えられ$1$2
ます。私は実際には、2 番目と 3 番目の選択肢の始まりだけを除外しました。デモ。
最後に、Sublime がBoost の拡張フォーマット文字列構文を使用している場合、実際には条件付きで (ファイル拡張子から魔法のように文字を呼び出すことなく) 文字を置換に入れることができます。
^.+/src/|\G(/)?([^/]+)|\G/[^/]+$
これで、(削除する)までのすべての最初の選択肢src
、最後のスラッシュとファイル名の 3 番目の選択肢 (削除する)、および保持するすべてのフォルダーの中間の選択肢ができました。今回は任意で置換するスラッシュを先頭に入れました。条件付き置換を使用する.
と、そのスラッシュが一致した場合にのみそこに書き込むことができます。
(?1.:)$2
残念ながら、私は今これをテストすることができず、Boost の正規表現エンジンを使用するオンライン テスターを知りません。しかし、これはうまくいくはずです。