Regex backreferences в IntelliJ

Я хочу использовать функцию IntelliJ find-and-replace для выполнения следующего преобразования:

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

Я пробовал следующее:

Текст для поиска: model.put\((.*),(.*)\) Заменить на: model\[\\1\] = \\2

Но Intellij, кажется, не распознает \\1 и \\2 как обратные ссылки. Я также пробовал одну косую черту, но это тоже не работает.

Спасибо, Дон

Ответ 1

IntelliJ использует $1 для замены обратных ссылок.

Из справки IntelliJ:

Дополнительные сведения о регулярных выражениях и их синтаксисе см. в документации для java.util.regex Обратные ссылки должны иметь $n, а не \n.

Ответ 2

Короче говоря, вы должны использовать $1 для $n для замены обратных ссылок. Синтаксис \1 предназначен только для обратных ссылок в рамках поиска.

В IntelliJ 2016 документация в приложении вводит в заблуждение. Вот лучшая цитата из полного документа:

Если вам нужно отнести соответствие подстроки где-то вне текущего регулярного выражения (например, в другом регулярном выражении в качестве строки замены), вы можете получить ее с помощью знака доллара ($ num, где num = 1..n).

Источник: 2016.1 синтаксис регулярных выражений, советы и рекомендации

Ответ 3

IntelliJ IDEA/Ссылка/Ссылка на синтаксис регулярного выражения


Соответствует подвыражению и запоминает совпадение. Если вам нужно использовать подобранную подстроку в одном и том же регулярном выражении, вы можете получить ее с помощью backreference (\num, где num = 1..n). Если вам нужно передать согласованную подстроку где-то вне текущего регулярного выражения (например, в другом регулярном выражении в поле "Замена" ), вы можете получить ее с помощью знака доллара ($ num, где num = 1..n). Если вам нужно включить символы скобок в подвыражение, используйте "(" или ")".

Ответ 4

Контекстная справка для регулярных выражений в продукте Idea 9.0 (и, возможно, другие версии) выглядит некорректной. В нем говорится следующее:

  Back references
  \n
  Whatever the nth capturing group matched

Но, по-видимому, как упоминалось в предыдущих ответах, и это мой опыт, он действительно \$n для обратных ссылок, а не \n

Вы получите эту контекстуальную справку, щелкнув ссылку "[Справка]" рядом с параметром "Регулярное выражение" в диалоговом окне "Заменить текст"