Eclipse, ricerca e sostituzione di espressioni regolari


119

In eclipse, è possibile utilizzare la stringa di ricerca corrispondente come parte della stringa di sostituzione quando si esegue una ricerca e sostituzione di espressioni regolari?

Fondamentalmente, voglio sostituire tutte le occorrenze di

variableName.someMethod()

con:

((TypeName)variableName.someMethod())

Dove variableName può essere qualsiasi nome di variabile.

In sed potrei usare qualcosa del tipo:

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

Ovvero, & rappresenta la stringa di ricerca corrispondente. C'è qualcosa di simile in Eclipse?

Grazie!


Buona documentazione su Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon

Risposte:


225

Sì, "()" acquisisce un gruppo. puoi usarlo di nuovo con $ i dove i è l'iesimo gruppo di cattura.

Così:

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

sostituire: ((TypeName)$1)

Suggerimento: il segno CTRL+ Spacenelle caselle di testo fornisce tutti i tipi di suggerimenti per la scrittura di espressioni regolari.


È una bella risposta e un utile suggerimento. Sarebbe stato più utile se fosse stato descritto in modo più dettagliato.
iammilind

Bravo Eclipse, hai implementato correttamente questa funzione!
Kenogu Labz

Mi piace particolarmente l'esempio di "Codice esadecimale per carattere Unicode" :)
Stewart Murrie

Vorrei aggiungere del codice che mi ha davvero aiutato. Avevo bisogno di sostituire ogni stringVar.equals("xxx")con "xxx".equals(stringVar). Ho usato la seguente regex nella finestra di dialogo trova / sostituisci: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude

Non per me. Sostituisce sempre il primo gruppo ...?
RightmireM

6

Utilizzando ...
ricerca = (^. * Import) (. *) (\ (. * \) :)
sostituire = $ 1 $ 2

... sostituisce ...

from checks import checklist(_list):

...con...

from checks import checklist



I blocchi in regex sono delineati da parentesi (che non sono preceduti da una "\")

(^. * Import) trova "from checks import" e lo carica a $ 1 (eclipse inizia a contare da 1)

(. *) Trova il successivo " tutto "fino al prossimo incontro" ("e lo carica a $ 2. $ 2 si ferma al" ("a causa della parte successiva (vedi la riga successiva sotto)

(\ (. * \) :) dice" al primo incontro "( "dopo aver iniziato il blocco $ 2 ... ferma il blocco $ 2 e inizia $ 3. $ 3 viene caricato con" ('any text'): "o, nell'esempio," (_list): "

Quindi nella sostituzione, inserisci semplicemente il $ 1 $ 2 per sostituire tutti e tre i blocchi solo con i primi due.



Immagine dello schermo


3

NomeN ha risposto correttamente, ma questa risposta non sarebbe di grande utilità per i principianti come me perché avremo un altro problema da risolvere e non sapremmo come usare RegEx lì dentro. Quindi sto aggiungendo un po 'di spiegazione a questo. La risposta è

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

sostituire: ((TypeName) $ 1)

Qui:

In cerca:

  • Il primo e l'ultimo '(' ')' rappresentano un gruppo in regex

  • "\ w" rappresenta parole (alfanumerico + trattino basso)

  • "+" rappresenta uno o più (ovvero uno o più caratteri alfanumerici + trattino basso)

  • '' è un carattere speciale che raffigura qualsiasi carattere (es. + significa uno o più di qualsiasi carattere). Perché questo è un carattere speciale per rappresentare un "." dovremmo dare un carattere di escape con esso, cioè "."

  • 'someMethod' viene fornito così come deve essere cercato.

  • Le due parentesi '(', ')' vengono fornite insieme al carattere di escape perché sono caratteri speciali che vengono utilizzati per rappresentare un gruppo (parleremo del gruppo nel punto successivo)

In sostituzione:

  • Viene fornito " ((TypeName) $ 1) ", qui $ 1 rappresenta il gruppo. Ovvero tutti i caratteri racchiusi tra la prima e l'ultima parentesi "(", ")" nel campo di ricerca

  • Assicurati inoltre di aver selezionato l'opzione "Espressione regolare" nella casella Trova una sostituzione

Ulteriori informazioni su RegEx possono essere trovate in http://regexr.com/ .


2

Almeno in STS (SpringSource Tool Suite) i gruppi sono numerati a partire da 0, quindi la stringa di sostituzione sarà

replace: ((TypeName)$0)

5
Non è vero afaik. $ 0 rappresenta l'intero termine di ricerca originale. In questo caso, credo che funzionerebbe per coincidenza.
Walter Heck

0

Per qualcuno che ha bisogno di una spiegazione e un esempio di come utilizzare un regxp in Eclipse. Ecco il mio esempio che illustra il problema.

inserisci qui la descrizione dell'immagine

Voglio rinominare

/download.mp4^lecture_id=271

per

/271.mp4

E possono esserci più di questi.

Ecco come dovrebbe essere fatto.

inserisci qui la descrizione dell'immagine

Quindi premi il pulsante trova / sostituisci

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.