Regex para remover javadocs

2 respostas
M
Estava eu tentando editar algumas classes de um projeto aqui quando me deu a idéia de remover todos os javadocs com regex. Pensei q ia ser a coisa mais fácil do mundo mas acabei sem solução funcionando. O melhor q consegui chegar foi /\*\*[\s\S]*\*/ mas ele nao pega javadocs contiguos, ele dá match nisso:
/**
* doc 0
*
*/

/**
* doc 1
*
*/
e nao nisso:
/**
* doc 0
*
*/
e depois nisso:
/**
* doc 1
*
*/

Alguem tem uma solução?

2 Respostas

fabiofalci

Cara, eu precisei de algo parecido uma vez. Olhando alguns codigos achei esse:

public class Aspas {

	static String java = 
			"/**\n" +
			" * javadoc com alguns caracaters * '\"\n" +
			" * mais uma 'linha'\n" +
			" */\n" +
			"private String teste;\n" +
			"/** javadoc */\n" +
			"private String teste;\n" +			
			"/*\n"+
			" * comment\n" +
			" * mais uma 'linha'\n" +
			" */\n" +
			"private String teste;\n" +
			"/* comment */\n" +
			"private String teste;\n" +					
			"// single line\n" +
			"private String teste;\n";

	public static void main(String[] args) {
		String pattern1 = "/\*(.)*\*/"; // comentarios multi
		String pattern2 = "//(.)*"; // comentarios single, ate final da linha
		String pattern3 = "/\*(.)*"; // comentarios multi quebrados
		String pattern31 = "\*(.)*"; // meio comentarios multi quebrados
		String pattern32 = "\*/"; // final comentarios multi quebrados
		String pattern4 = "\"(.)*\""; // aspas
		String pattern5 = "'(.)'"; // char

		System.out.println("(antes)\n" + java);
		String str = java.replaceFirst(pattern1, "");
		str = str.replaceFirst(pattern1, "");
		str = str.replaceAll(pattern2, "");
		str = str.replaceAll(pattern3, "");
		str = str.replaceAll(pattern31, "");
		str = str.replaceAll(pattern32, "");
		str = str.replaceAll(pattern4, "");
		str = str.replaceAll(pattern5, "");
		System.out.println("(depois)\n" + str);		
	}
}

Resolvi com varias expressoes regulares. Só não estou lembrado o pq tem regexp pra
tirar aspas e char.
Talvez não precise, deveria ser alguns testes

*Editado: Olhando com mais cuidado agora, não vai funcionar para javadoc nos métodos que estiverem *
no meio de uma string por exemplo. Mas é um bom começo, tu pode incluir esse tratamento.

M

vixi mano, eu consegui.
Tem um tipo de matcher non greedy (? ou +?), que eh essas paradinhas de * ou + mas que tentam pegar a maior string e sim o primeiro que satisfazer o padrao do regex.
Então ali em vez de /**[\s\S]
*/ é só utilizar /**[\s\S]*?*/

Isso vale pra comentário de multilinhas tb.
Eh soh tirar um dos * no começo do pattern

Criado 24 de janeiro de 2008
Ultima resposta 24 de jan. de 2008
Respostas 2
Participantes 2