Eclipse, поиск и замена регулярных выражений


119

В eclipse можно ли использовать совпавшую строку поиска как часть строки замены при выполнении поиска и замены регулярного выражения?

По сути, я хочу заменить все вхождения

variableName.someMethod()

с участием:

((TypeName)variableName.someMethod())

Где variableName может быть любым именем переменной.

В sed я мог бы использовать что-то вроде:

s/[a-zA-Z]+\.someMethod\(\)/((TypeName)&)/g

То есть & представляет совпавшую строку поиска. Есть ли что-то подобное в Eclipse?

Спасибо!


Хорошая документация по Eclipse RegEx: RegEx help.eclipse.org/kepler/…
— Каньон Колоб

Ответы:


225

Да, "()" фиксирует группу. вы можете использовать его снова с $ i, где i - это i-я группа захвата.

Так:

поиск: (\w+\.someMethod\(\))

заменить: ((TypeName)$1)

Подсказка: CTRL+Space в текстовых полях дает вам всевозможные предложения по написанию регулярных выражений.


Это хороший ответ и полезный намек. Было бы более полезно, если бы это было описано немного подробнее.
— iammilind

Bravo Eclipse, вы правильно реализовали эту функцию!
— Kenogu Labz

Мне особенно нравится пример «Шестнадцатеричный код для символа Юникода» :)
— Стюарт Мюрри

Я хотел бы добавить код, который мне действительно помог. Мне нужно было заменить каждый stringVar.equals("xxx")на "xxx".equals(stringVar). Я использовал следующее регулярное выражение в диалоговом окне поиска / замены: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
— LaDude

Не для меня. Всегда заменяет первую группу ...?
— RightmireM

6

Использование ...
search = (^. * Import) (. *) (\ (. * \) :)
replace = $ 1 $ 2

... заменяет ...

from checks import checklist(_list):

...с участием...

from checks import checklist



Блоки в регулярном выражении выделяются круглыми скобками (которым не предшествует "\")

(^. * Import) находит "from check import" и загружает его в $ 1 (eclipse начинает отсчет с 1)

(. *) Find the next " все "до следующего встретившегося" ("и загружает его в $ 2. $ 2 останавливается на" ("из-за следующей части (см. следующую строку ниже)

(\ (. * \) :) говорит" при первой встречке "( "после начала блока $ 2 ... остановить блок $ 2 и начать $ 3. $ 3 загружается с" ('любой текст'): "или, в примере," (_list): "

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



Скриншот


3

NomeN ответил правильно, но этот ответ будет бесполезен для новичков, таких как я, потому что у нас будет еще одна проблема, которую нужно решить, и мы не будем знать, как использовать там RegEx. Поэтому я добавляю к этому небольшое пояснение. Ответ

поиск: (\ w + \. someMethod \ (\))

заменить: ((TypeName) $ 1)

Вот:

В поисках:

  • Первый и последний '(' ')' обозначают группу в регулярном выражении

  • '\ w' обозначает слова (буквенно-цифровые + подчеркивание)

  • '+' обозначает один или несколько (например, один или несколько букв, цифр + подчеркивание)

  • '' - это специальный символ, который обозначает любой символ (т. е. + означает один или несколько любых символов). Потому что это специальный символ для изображения '.' мы должны дать ему escape-символ, то есть '.'

  • "someMethod" задается так, как нужно искать.

  • Две круглые скобки '(', ')' даются вместе с escape-символом, потому что они являются специальными символами, которые используются для изображения группы (мы обсудим группу в следующем пункте)

На замену:

  • Дано ' ((TypeName) $ 1) ', здесь $ 1 обозначает группу. Это все символы, заключенные в первую и последнюю круглые скобки '(', ')' в поле поиска.

  • Также убедитесь, что вы отметили опцию «Регулярное выражение» в поле поиска замены.

Более подробную информацию о RegEx можно найти на http://regexr.com/ .


2

По крайней мере, группы STS (SpringSource Tool Suite) пронумерованы, начиная с 0, поэтому строка замены будет

replace: ((TypeName)$0)

5
Это не так, афайк. $ 0 представляет собой весь исходный поисковый запрос. В этом случае, я думаю, это сработает по совпадению.
— Уолтер Хек

0

Для тех, кому нужно объяснение и пример использования regxp в Eclipse. Вот мой пример, иллюстрирующий проблему.

введите описание изображения здесь

Я хочу переименовать

/download.mp4^lecture_id=271

в

/271.mp4

И их может быть несколько.

Вот как это надо делать.

введите описание изображения здесь

Затем нажмите кнопку поиска / замены

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