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.