134

I want to use IntelliJ's find-and-replace feature to perform the following transformation:

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

I've tried the following:

Text to find: model.put\((.*),(.*)\) Replace with: model\[\\1\] = \\2

But Intellij doesn't seem to recognise \\1 and \\2 as backreferences. I've also tried a single slash, but that doesn't work either.

Zoe
  • 27,060
  • 21
  • 118
  • 148
Dónal
  • 185,044
  • 174
  • 569
  • 824

4 Answers4

199

IntelliJ uses $1 for replacement backreferences.

From IntelliJ's help:

For more information on regular expressions and their syntax, refer to documentation for java.util.regex Back references should have $n, rather than \n format.

bradley.ayers
  • 37,165
  • 14
  • 93
  • 99
Steve K
  • 19,408
  • 6
  • 52
  • 50
  • 16
    Seems like "\" is not required: https://www.jetbrains.com/idea/help/finding-and-replacing-text-in-file.html#d1765718e362. Also, for me it works only if I explicitly surround my group with "()", otherwise I can't reference it later. Ex: search ```(foo)``` replace: ```$1bar``` – Ghedeon Nov 17 '15 at 15:41
  • @Ghedeon: You should probably add your comment as an answer or to the existing answer. Your suggestion to put the expression in () is what worked for me. – mindreader Feb 01 '17 at 01:15
  • +1 the bit of information that solved my related problem: i'm replacing quote-plus wrappers around variables with dollar-curly wrappers, ie, `'+ var +'` to `${var}` in some template strings and couldn't figure out why intellij wouldn't finish the replacement. turns out `$` needs to be escaped in the replacement. – worc Oct 18 '17 at 21:39
14

In short, you must use $1 to $n for replacement backreferences. \1 syntax is only for backreferences within the search.

In IntelliJ 2016, the in-app documentation is misleading. Here is a better quote from the full docs:

If you need to refer the matched substring somewhere outside the current regular expression (for example, in another regular expression as a replacement string), you can retrieve it using the dollar sign ($num, where num = 1..n).

Source: 2016.1 regular expression syntax, Tips & Tricks

Barett
  • 5,826
  • 6
  • 51
  • 55
2

The in-product contextual help for regex in Idea 9.0 (and perhaps other versions) appears to be incorrect. It states this:

  Back references
  \n
  Whatever the nth capturing group matched

But apparently, as mentioned in previous answers and is my experience, it's really \$n for back references, rather than \n

You get to this contextual help by clicking the '[Help]' link next to the "Regular expression" radio option on the the "Replace Text" dialog box

Glen
  • 171
  • 1
  • 6
0

IntelliJ IDEA /  Reference /  Regular Expression Syntax Reference


Matches subexpression and remembers the match. If you need to use the matched substring within the same regular expression, you can retrieve it using the backreference (\num, where num = 1..n). If you need to refer the matched substring somewhere outside the current regular expression (for example, in another regular expression in the Replacement field), you can retrieve it using the dollar sign ($num, where num = 1..n). If you need to include the parentheses characters into the subexpression, use "(" or ")".

Cong De Peng
  • 321
  • 1
  • 4
  • 11
  • I found the same thing [here](http://www.jetbrains.com/idea/webhelp/regular-expression-syntax-reference.html); however, I ultimately had success using $1, without the backslash. – Joe Tricarico May 30 '14 at 14:44