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.