Eclipse, búsqueda y reemplazo de expresiones regulares

119

En eclipse, ¿es posible usar la cadena de búsqueda coincidente como parte de la cadena de reemplazo al realizar una búsqueda y reemplazo de expresión regular?

Básicamente, quiero reemplazar todas las apariciones de

variableName.someMethod()

con:

((TypeName)variableName.someMethod())

Donde variableName puede ser cualquier nombre de variable.

En sed , podría usar algo como:

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

Es decir, & representa la cadena de búsqueda coincidente. ¿Hay algo similar en Eclipse?

¡Gracias!

Greg
fuente
Buena documentación sobre Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon

Respuestas:

225

Sí, "()" captura un grupo. puede usarlo de nuevo con $ i donde i es el grupo de captura i'th.

Entonces:

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

reemplazar: ((TypeName)$1)

Sugerencia: CTRL+ Spaceen los cuadros de texto le brinda todo tipo de sugerencias para la escritura de expresiones regulares.

No hombre
fuente
Esa es una buena respuesta y una pista útil. Habría sido más útil si se hubiera descrito con un poco más de detalle.
iammilind
Bravo Eclipse, ¡implementó esta función correctamente!
Kenogu Labz
Me encanta especialmente el ejemplo de "Código hexadecimal para carácter Unicode" :)
Stewart Murrie
Me gustaría agregar un código que realmente me ayudó. Necesitaba reemplazar cada uno stringVar.equals("xxx")con "xxx".equals(stringVar). Usé la siguiente expresión regular en el cuadro de diálogo buscar / reemplazar: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude
No para mí. ¿Reemplaza siempre al primer grupo ...?
RightmireM
6

Usando ...
buscar = (^. * Importar) (. *) (\ (. * \) :)
reemplazar = $ 1 $ 2

... reemplaza ...

from checks import checklist(_list):

...con...

from checks import checklist



Los bloques en expresiones regulares están delineados por paréntesis (que no están precedidos por un "\")

(^. * Import) encuentra "from checks import" y lo carga en $ 1 (el eclipse comienza a contar en 1)

(. *) Encuentra el siguiente " todo "hasta el siguiente encontrado" ("y lo carga a $ 2. $ 2 se detiene en" ("debido a la siguiente parte (ver la siguiente línea a continuación)

(\ (. * \) :) dice" en el primer encontrado "( "después de iniciar el bloque $ 2 ... detener el bloque $ 2 y comenzar $ 3. $ 3 se carga con el" ('cualquier texto'): "o, en el ejemplo, el" (_list): "

Luego, en el reemplazo, simplemente coloque el $ 1 $ 2 para reemplazar los tres bloques con solo los dos primeros.



Captura de pantalla

RightmireM
fuente
3

NomeN ha respondido correctamente, pero esta respuesta no sería de mucha utilidad para principiantes como yo porque tendremos otro problema que resolver y no sabríamos cómo usar RegEx allí. Así que añado un poco de explicación a esto. La respuesta es

búsqueda: (\ w + \. someMethod \ (\))

reemplazar: ((TypeName) $ 1)

Aquí:

En busca:

  • El primer y último '(' ')' representa un grupo en expresiones regulares

  • '\ w' representa palabras (alfanumérico + guión bajo)

  • '+' representa uno o más (es decir, uno o más caracteres alfanuméricos + subrayado)

  • '.' es un carácter especial que representa cualquier carácter (es decir, + significa uno o más de cualquier carácter). Porque este es un carácter especial para representar un '.' deberíamos darle un carácter de escape, es decir, '.'

  • 'someMethod' se da tal como se va a buscar.

  • Los dos paréntesis '(', ')' se dan junto con el carácter de escape porque son caracteres especiales que se utilizan para representar un grupo (discutiremos sobre el grupo en el siguiente punto)

En reemplazo:

  • Se le da ' ((TypeName) $ 1) ', aquí $ 1 representa el grupo. Esos son todos los caracteres que están encerrados entre el primer y último paréntesis '(', ')' en el campo de búsqueda

  • También asegúrese de haber marcado la opción 'Expresión regular' en buscar un cuadro de reemplazo

Puede encontrar más información sobre RegEx en http://regexr.com/ .

padippist
fuente
2

Al menos en STS (SpringSource Tool Suite) los grupos se numeran comenzando desde 0, por lo que reemplazar la cadena será

replace: ((TypeName)$0)
Yaroslav Lyakh
fuente
5
Eso no es cierto afaik. El $ 0 representa el término de búsqueda original completo. En este caso, supongo que funcionaría casualmente.
Walter Heck
0

Para alguien que necesita una explicación y un ejemplo de cómo usar un regxp en Eclipse. Aquí está mi ejemplo que ilustra el problema.

ingrese la descripción de la imagen aquí

Quiero cambiar el nombre

/download.mp4^lecture_id=271

a

/271.mp4

Y puede haber varios de estos.

Así es como debe hacerse.

ingrese la descripción de la imagen aquí

Luego presione el botón Buscar / Reemplazar

MadNik
fuente