Regular Expression para Annotation

Caros,

Preciso fazer parsing de fontes Java, para pegar as configurações das annotation de entidades JPA.

Um caso particular são as anotações @Column, que podem conter quebra de linha. E quando ocorre a quebra de linha, eu não consigo uma regular expression que me identifique o bloco.

String REGEX_COLUMN_ANNOTATION_GROUP = "@Column\\([^\\)]+\\)";

Isso funciona bem com:

@Column(name="bla", nullable=false)

Mas não rola com:

@Column(name="bla", nullable=false)
Tentei resolver a quebra de linha de outros modos mas não consegui.

Alguma ajuda?

A api de expressões regulares do java permite Expressões Multilinha, pesquise a documentação, vc precisa informar uma flag.

Se você puder pegar os fontes compilados (.class), e carregá-los com Class.forName (a versão com 3 parâmetros, que permite alterar o classloader e também não chamar os blocos de inicialização), acho que é mais fácil obter as anotações.

Tentei usar das duas formas, conforme descrito aqui.
Ambas não funcionaram.

Regex:code(@.\s)+(public|private|protected)(\s+)(\w+)(\s+)(\w+)(\s*;)[/code]
Texto OK:@Id @Column( name="ID",nullable=false) private Long id;
Texto não OK:@Id @Column( name="ID", nullable=false) private Long id;
Preciso que funcione com ambos.

Sim, já pensei nisso. Mas neste caso quero imaginar que não terei acesso aos binários, mas somente aos fontes (.java).

Bom, parece que isto aqui resolve meu problema:

(@[^@{]+?)+(public|private|protected)(\\s+)(\\w+)(\\s+)(\\w+)(\\s*;)

O “{” evita de pegar a declaração da classe. Exemplo:

@Entity public class X { ...

e só pega o atributo com os mapeamentos (annotations).

O estranho é que, segundo o documento da Sun, o “\s” representa caracteres de espaço, inclusive a quebra de linha e retorno de carro.
http://java.sun.com/docs/books/tutorial/essential/regex/pre_char_classes.html