Eclipse, busca e substituição de expressão regular

119

No eclipse, é possível usar a string de pesquisa correspondente como parte da string de substituição ao realizar uma pesquisa e substituição de expressão regular?

Basicamente, desejo substituir todas as ocorrências de

variableName.someMethod()

com:

((TypeName)variableName.someMethod())

Onde variableName pode ser qualquer nome de variável.

No sed, eu poderia usar algo como:

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

Ou seja, & representa a string de pesquisa correspondente. Existe algo semelhante no Eclipse?

Obrigado!

Greg
fonte
Boa documentação sobre Eclipse RegEx: help.eclipse.org/kepler/…
Kolob Canyon

Respostas:

225

Sim, "()" captura um grupo. você pode usá-lo novamente com $ i, onde i é o i'ésimo grupo de captura.

Assim:

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

substituir: ((TypeName)$1)

Dica: CTRL+ Spacenas caixas de texto oferece todos os tipos de sugestões para a escrita de expressões regulares.

NomeN
fonte
Essa é uma boa resposta e uma dica útil. Teria sido mais útil se tivesse sido descrito com mais detalhes.
iammilind
Bravo Eclipse, você implementou esse recurso corretamente!
Kenogu Labz
Gosto especialmente do exemplo de "Código hexadecimal para caracteres Unicode" :)
Stewart Murrie
Eu gostaria de adicionar um código que realmente me ajudou. Eu precisava substituir todos stringVar.equals("xxx")por "xxx".equals(stringVar). Usei o seguinte regex na caixa de diálogo localizar / substituir: search: ([^()! ]+).equals\("(.*)"\), replace: "$2".equals\($1\).
LaDude
Não para mim. Sempre substitui o primeiro grupo ...?
RightmireM de
6

Usando ...
search = (^. * Import) (. *) (\ (. * \) :)
replace = $ 1 $ 2

... substitui ...

from checks import checklist(_list):

...com...

from checks import checklist



Os blocos no regex são delineados por parênteses (que não são precedidos por um "\")

(^. * Import) localiza "da importação de cheques" e carrega para $ 1 (o eclipse começa a contar em 1)

(. *) Encontre o próximo " tudo "até o próximo encontrado" ("e carrega para $ 2. $ 2 para no" ("por causa da próxima parte (veja a próxima linha abaixo)

(\ (. * \) :) diz" no primeiro encontrado "( "depois de iniciar o bloco $ 2 ... pare o bloco $ 2 e comece $ 3. $ 3 é carregado com o" ('qualquer texto'): "ou, no exemplo, o" (_list): "

Em seguida, na substituição, basta colocar o $ 1 $ 2 para substituir todos os três blocos apenas pelos dois primeiros.



Captura de tela

RightmireM
fonte
3

O NomeN respondeu corretamente, mas essa resposta não seria muito útil para iniciantes como eu porque teremos outro problema para resolver e não saberíamos como usar o RegEx lá. Portanto, estou adicionando um pouco de explicação a isso. A resposta é

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

substituir: ((TypeName) $ 1)

Aqui:

Em busca:

  • O primeiro e o último '(' ')' representam um grupo em regex

  • '\ w' representa palavras (alfanumérico + sublinhado)

  • '+' representa um ou mais (ou seja, um ou mais alfanuméricos + sublinhado)

  • '.' é um caractere especial que representa qualquer caractere (ou seja, + significa um ou mais de qualquer caractere). Porque este é um personagem especial para representar um '.' devemos fornecer um caractere de escape com ele, ou seja, '.'

  • 'someMethod' é fornecido como deve ser pesquisado.

  • Os dois parênteses '(', ')' são fornecidos junto com o caractere de escape porque eles são caracteres especiais que são usados ​​para representar um grupo (discutiremos sobre o grupo no próximo ponto)

Em substituição:

  • É dado ' ((TypeName) $ 1) ', aqui $ 1 representa o grupo. São todos os caracteres que estão entre o primeiro e o último parênteses '(', ')' no campo de pesquisa

  • Além disso, certifique-se de ter marcado a opção 'Expressão regular' em localizar uma caixa de substituição

Mais informações sobre RegEx podem ser encontradas em http://regexr.com/ .

padippist
fonte
2

Pelo menos em STS (SpringSource Tool Suite) os grupos são numerados a partir de 0, então a string de substituição será

replace: ((TypeName)$0)
Yaroslav Lyakh
fonte
5
Isso não é verdade, afaik. O $ 0 representa todo o termo de pesquisa original. Neste caso, acho que funcionaria por coincidência.
Walter Heck
0

Para quem precisa de uma explicação e um exemplo de como usar um regxp no Eclipse. Aqui está meu exemplo ilustrando o problema.

insira a descrição da imagem aqui

Eu quero renomear

/download.mp4^lecture_id=271

para

/271.mp4

E pode haver vários deles.

Aqui está como isso deve ser feito.

insira a descrição da imagem aqui

Em seguida, clique no botão localizar / substituir

MadNik
fonte