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!


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.


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


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/ .


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)

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.