Обратные ссылки RegEx в IntelliJ


129

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

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

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

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

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

Ответы:


196

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

Из справки IntelliJ:

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


15
Кажется, что "\" не требуется: jetbrains.com/idea/help/… . Кроме того, для меня это работает, только если я явно окружаю свою группу знаком «()», иначе я не смогу ссылаться на нее позже. Пример: поиск (foo)заменить:$1bar
Ghedeon

@Ghedeon: Вам, вероятно, следует добавить свой комментарий в качестве ответа или к существующему ответу. Ваше предложение поместить выражение в () - это то, что сработало для меня.
mindreader 01

+1 бита информации , что решить мою родственную задачу: я буду заменять кавычки-плюс обертки вокруг переменных с долларовой фигурной оберток, то есть, '+ var +'чтобы ${var}в некоторых строках шаблона и не мог понять, почему IntelliJ бы не закончить замену. Оказывается, $нужно убежать в замену.
Ворк

13

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

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

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

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


2

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

  Обратные ссылки
  \ п
  Независимо от того, что соответствует n-ой группе захвата

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

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


0

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


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


Я нашел то же самое здесь ; однако в конечном итоге я добился успеха, используя 1 доллар без обратной косой черты.
Джо Трикарико
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.