Sublime Text 2の正規表現検索置換


440

Sublime Text 2の正規表現で検索置換を実行しようとしています。これに関するドキュメントはかなり貧弱です。具体的には、グループを置換したいので、このテキストを変換するようなものです:

Hello my name is bob

そして、この検索用語:

何を見つける: my name is (\w)+

と置換する: my name used to be $(1)

検索語は問題なく機能しますが、正規表現グループを使用して実際に置換を行う方法がわかりません。

回答:


583

通常、後方参照は最初のキャプチャグループ(かっこ内のパターンの最初の一致)の$1or \1(バックスラッシュ1)であり、実際にSublimeは両方の構文をサポートしています。だから試してください:

my name used to be \1

または

my name used to be $1

また、元のキャプチャパターンは次のとおりです。

my name is (\w)+

は正しくなく、名前全体ではなく、名前の最後の文字のみをキャプチャします。名前のすべての文字をキャプチャするには、次のパターンを使用する必要があります。

my name is (\w+)

15
例外ではありません$0か?
Skylar Saveland 2013年

11
いいえ、$ 0は正規表現の後方参照としては使用されません(\0null文字に相当し、\0dddコードポイントがdddの文字のエスケープとして使用されるため)。ただし、このページに$0よると、Sublime2では「出口マーク」として使用されているようです(ただし、Sublime2で出口マークがどのように使用されているかを正確に把握するのに十分な例を見つけるのに苦労しています)。
2013

3
出口マーク$0はSublime Text 2/3でスニペット拡張からの出口にカーソルを置くために使用されます。スニペットの詳細
jrhorn424 2013

2
$ 0は依然としてSublime Text 2の式全体を

2
$0全体の正規表現一致です。$1最初のキャプチャグループです。
Oletha 2016

103

ちなみに、上記の質問では:

ために:

Hello, my name is bob

パーツを探す:

my name is (\w)+

交換部品付き:

my name used to be \1

戻ります:

Hello, my name used to be b

検索パーツを次のように変更します。

my name is (\w+)

そして、交換はあなたが期待するものになります:

Hello, my name used to be bob

(\ w)+は「bob」と一致しますが、置換するために必要なグループではありません。


52

重要:( )検索文字列で括弧を使用してください

前の答えは正しいですが、強調すべき重要なことがあります!すべての検索文字列にマッチしたセグメント、あなたの中で使用したいという置換文字列をしなければならないで囲まれた( )括弧そうでない場合は、これらの一致したセグメントのような定義された変数にアクセスすることはできません、$1$2または\1\2など

たとえば、「em」を「px」に置き換えて、数字の値は保持したいとします。

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • 置換文字列:margin: $1pxまたはmargin: \1px
  • 検索文字列(正しい):margin: ([0-9]*)em//括弧付き
  • 検索文字列(INCORRECT): margin: [0-9]*em

正しいケースの例:margin: ([0-9]*)em検索文字列の使用(括弧付き)。次のように、目的の一致したセグメント($1または\1)を( )括弧で囲みます。

  • 検索:(margin: ([0-9]*)em括弧付き)
  • 置換先:margin: $1pxまたはmargin: \1px
  • 結果:
    margin: 10px;
    margin: 2px;

誤ったケースの例:margin: [0-9]*em検索文字列の使用(括弧なし)。次の正規表現パターンは目的の行に一致しますが、一致したセグメントは、$1またはなどの変数として置換された文字列では使用できません\1

  • 検索:(margin: [0-9]*em括弧なし)
  • 置換先:margin: $1pxまたはmargin: \1px
  • 結果:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
ありがとう、この回答は私の問題を解決した興味深い事実を本当に指摘しています。
Enkk 2016年

指摘してくれてありがとう。()で、私は崇高3で\ 1で置き換える行うことができます
ジェフリー

47

これは、承認された回答を視覚的に表したものです。

ここに画像の説明を入力してください


なぜ見つけられないの$_SESSION[(\w+)ですか?感謝
Toni Michel Caubet

$、[、(、および)は特殊文字であるため、バックスラッシュで各特殊文字をエスケープする必要があります。
zeeawan

25

9つを超えるキャプチャグループを使用する場合は、構文を使用する必要があることに注意してください${10}

$10あるいは\10または\{10}だろうではない仕事。


ありがとう!これは、キャプチャされたグループの末尾に番号を置き換えて追加するのに役立ちました。たとえば1、2番目のキャプチャグループにを追加して、のように中かっこを使用する必要があります${2}1。$ 21は存在しない21番目のキャプチャグループを示します。
Eric

1

見ると検索に崇高テキスト非公式文書の記事と交換するように、それは見えます+(.+)したいかもしれないキャプチャグループである...しかし、私は個人的に使用(.*)し、それがうまく働きました。あなたが言っている方法で置き換えるために、あなたはフォーラムでのこの会話、特に最初にキャプチャされたグループを使用するために単に使用するように言うこの投稿が好きかもしれません$1

そして写真は言葉よりも優れているので...

前: 検索/置換する前

後: 検索/置換後

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.