web-dev-qa-db-ja.com

IntelliJのRegEx後方参照

IntelliJの検索と置換機能を使用して、次の変換を実行したいと思います。

_// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar
_

私は次を試しました:

検索するテキスト:model.put\((.*),(.*)\)置換:_model\[\\1\] = \\2_

ただし、Intellijは_\\1_および_\\2_を後方参照として認識していないようです。また、単一のスラッシュを試しましたが、それも機能しません。

128
Dónal

IntelliJは、replacement後方参照に$1を使用します。

IntelliJのヘルプから:

正規表現とその構文の詳細については、 Java.util.regex のドキュメントを参照してください。後方参照には、\ n形式ではなく$ nを使用する必要があります。

194
Steve K

つまり、replacement後方参照に$1から$nを使用する必要があります。 \1構文は、検索内の後方参照専用です。

IntelliJ 2016では、アプリ内のドキュメントは誤解を招くものです。完全なドキュメントからのより良い引用です:

一致した部分文字列を現在の正規表現の外側(たとえば、置換文字列としての別の正規表現)で参照する必要がある場合は、ドル記号($ num、num = 1..n)を使用して取得できます。

出典: 2016.1正規表現構文、Tips&Tricks

13
Barett

Idea 9.0(およびおそらく他のバージョン)の正規表現の製品内コンテキストヘルプは正しくないようです。これはこう述べています:

バックリファレンス
\n 
 n番目のキャプチャグループが一致したものは何でも

しかし、明らかに、以前の回答で述べたように、私の経験では、実際には、\ nではなく、後方参照用の\ $ nです。

このコンテキストヘルプを表示するには、[テキストの置換]ダイアログボックスの[正規表現]ラジオオプションの横にある[[ヘルプ]]リンクをクリックします。

2
Glen

IntelliJ IDEA /リファレンス/正規表現構文リファレンス


部分表現に一致し、一致を記憶します。同じ正規表現内で一致した部分文字列を使用する必要がある場合は、後方参照(\ num、where num = 1..n)を使用して取得できます。現在の正規表現以外の場所(たとえば、置換フィールドの別の正規表現)で一致した部分文字列を参照する必要がある場合は、ドル記号($ num、num = 1..n)を使用して取得できます。括弧文字を部分式に含める必要がある場合は、「(」または「)」を使用します。

0
Cong De Peng