Zaćmienie, wyszukiwanie i zamiana wyrażeń regularnych

119

Czy w eclipse można użyć dopasowanego ciągu wyszukiwania jako części ciągu zastępującego podczas wyszukiwania i zastępowania wyrażeniem regularnym?

Zasadniczo chcę zastąpić wszystkie wystąpienia

variableName.someMethod()

z:

((TypeName)variableName.someMethod())

Gdzie nazwa zmiennej może w ogóle być nazwą dowolnej zmiennej.

W sedzie mógłbym użyć czegoś takiego:

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

Oznacza to, że & reprezentuje dopasowany ciąg wyszukiwania. Czy jest coś podobnego w Eclipse?

Dzięki!

Greg
źródło
Dobra dokumentacja dotycząca Eclipse RegEx: help.eclipse.org/kepler/ ...
Kolob Canyon

Odpowiedzi:

225

Tak, „()” przechwytuje grupę. możesz użyć go ponownie z $ i, gdzie i jest i-tą grupą przechwytywania.

Więc:

Szukaj: (\w+\.someMethod\(\))

zastąpić: ((TypeName)$1)

Wskazówka: znak CTRL+ Spacew polach tekstowych zawiera wszelkiego rodzaju sugestie dotyczące pisania wyrażeń regularnych.

NomeN
źródło
To miła odpowiedź i przydatna wskazówka. Byłoby bardziej pomocne, gdyby zostało opisane nieco bardziej szczegółowo.
iammilind
Bravo Eclipse, poprawnie zaimplementowałeś tę funkcję!
Kenogu Labz,
Szczególnie podoba mi się przykład „Kod szesnastkowy dla znaku Unicode” :)
Stewart Murrie
Chciałbym dodać kod, który naprawdę mi pomógł. Musiałem wymienić każdy stringVar.equals("xxx")z "xxx".equals(stringVar). Użyłem następującego wyrażenia regularnego w oknie dialogowym znajdź / zamień: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude
Nie dla mnie. Zawsze zastępuje pierwszą grupę ...?
RightmireM
6

Używając ...
search = (^. * Import) (. *) (\ (. * \) :)
replace = $ 1 $ 2

... zastępuje ...

from checks import checklist(_list):

...z...

from checks import checklist



Bloki w wyrażeniu regularnym są otoczone nawiasami (które nie są poprzedzone znakiem „\”)

(^. * Import) wyszukuje „z czeków importu” i ładuje je do $ 1 (zaćmienie zaczyna liczyć od 1)

(. *) Znajdź następny " wszystko "aż do następnego napotkanego" ("i wczytuje to do $ 2. $ 2 zatrzymuje się na" ("z powodu następnej części (zobacz następną linię poniżej)

(\ (. * \) :) mówi" przy pierwszym napotkanym "( "po rozpoczęciu bloku $ 2 ... zatrzymaj blok $ 2 i uruchom $ 3. $ 3 zostanie załadowany za pomocą" ('dowolny tekst'): "lub, w przykładzie," (_list): "

Następnie w zamian, po prostu wstaw 1 $ 2 $, aby zastąpić wszystkie trzy bloki tylko pierwszymi dwoma.



Zrzut ekranu

Rightmire M.
źródło
3

NomeN odpowiedział poprawnie, ale ta odpowiedź nie byłaby zbyt przydatna dla początkujących, takich jak ja, ponieważ będziemy mieli inny problem do rozwiązania i nie wiedzielibyśmy, jak tam używać RegEx. Więc dodaję do tego trochę wyjaśnienia. Odpowiedź to

szukaj: (\ w + \. jakaś metoda \ (\))

replace: ((TypeName) $ 1)

Tutaj:

W poszukiwaniu:

  • Pierwszy i ostatni znak „(„ ”)” przedstawia grupę w wyrażeniu regularnym

  • „\ w” przedstawia słowa (znaki alfanumeryczne + podkreślenie)

  • „+” przedstawia jeden lub więcej (tj. jeden lub więcej znaków alfanumerycznych + podkreślenie)

  • '.' to znak specjalny, który przedstawia dowolny znak (tj. + oznacza jeden lub więcej znaków dowolnego znaku). Ponieważ jest to specjalny znak przedstawiający „.” powinniśmy wraz z nim podać znak ucieczki, tj. „.”

  • „someMethod” jest podawana tak, jak ma być przeszukiwana.

  • Dwa nawiasy '(', ')' są podane wraz ze znakiem ucieczki, ponieważ są to znaki specjalne, które są używane do przedstawienia grupy (omówimy o grupie w następnym punkcie)

W zamian:

  • Otrzymuje on((TypeName) $ 1) ”, tutaj $ 1 przedstawia grupę. To są wszystkie znaki, które znajdują się w pierwszym i ostatnim nawiasie „(„, ”)” w polu wyszukiwania

  • Upewnij się również, że zaznaczyłeś opcję „Wyrażenie regularne” w polu Znajdź zamianę

Więcej informacji na temat RegEx można znaleźć pod adresem http://regexr.com/ .

padipistka
źródło
2

Przynajmniej grupy STS (SpringSource Tool Suite) są numerowane począwszy od 0, więc zastąpiony ciąg będzie

replace: ((TypeName)$0)
Yaroslav Lyakh
źródło
5
To nieprawda, afaik. 0 $ reprezentuje całe pierwotne wyszukiwane hasło. W tym przypadku myślę, że zadziałałoby to jednak przypadkowo.
Walter Heck
0

Dla kogoś, kto potrzebuje wyjaśnienia i przykładu użycia regxp w Eclipse. Oto mój przykład ilustrujący problem.

wprowadź opis obrazu tutaj

Chcę zmienić nazwę

/download.mp4^lecture_id=271

do

/271.mp4

Może być ich wiele.

Oto, jak należy to zrobić.

wprowadź opis obrazu tutaj

Następnie naciśnij przycisk znajdź / zamień

MadNik
źródło