Meu problema e o seguinte
tenho uma string c varios nomes de autores e outras informcaoes inuteis…
sei que os nomes dos autores estao assim NOME, SOBRENOME; para cada autor…
queria saber como eu limpo o lixo desta string?
Expressao regular
4 Respostas
ficou muito vago… posta o valor da string para agente ter uma idéia…
se a string tem apenas um autor, você pode tentar assim:
minhaString = minhaString.replace("expressaRegular", "");
Chame um faxineiro.
Sério, é melhor você postar um exemplo do que você quer limpar, e do resultado que você quer. Dependendo você precisa é de um bom script Perl, e de um especialista em Perl.
Bom,
Pelo que entendi o seu modelo de literal (String) deve ser + ou - assim:
String template = "nome1, sobrenome1, inutil11, inutil21, inutil31; nome2, sobrenome2, inutil12, inutil22, inutil32; nome3, sobrenome3, inutil13, inutil23, inutil33";
Para limpar isso via expressão regular tem alguns caminhos...
A primeira vista, é importante separar os registros de cada 'autor' e depois tratar cada coluna ( informações de cada autor) .
Para separar eu optei em fazer um split, outras postagens podem dar outra solução:
String[] templateArray = template.trim().split("\s*;\s*");
Esse linha trata os espaços em branco além de fazer o corte pelo caractere ';'
depois disso é possível fazer modificar a literal correspondente a cada Autor, com replaceAll:
for( String templateAutor : templateArray ) {
String novoTemplateAutor = templateAutor.replaceAll( "^([^,]*),([^,]*).*$","$1,$2" );
}
Esse trecho percorre cada literal do autor formatando com a expressão regular "^([^,]*),([^,]*).*$". Onde o primeiro e ultimo caractere '^' e '$' indica inicio e fim da literal. cada expressão "([^,]*)" significa qualquer caractere diferente de virgula ',', isso é repetido até o número de colunas queira identificar. Ao final da expressão tem ".*", para pegar o restante da literal.
Toda essa maneira de selecionar possibilita que eu gerar outra literal, aproveitando informações existentes... Para cada parenteses eu tenho um grupo de caracteres q eu posso devolver no método replaceAll... A forma de devolver é feito com o signa $ seguindo por um número de 1 a n, exemplo: $1, $2 e etc..
Assim, decidi mapear as duas primeiras colunas de cada autor e devolver apenas as duas.
Abaixo segue um teste funcional
public class TesteReplaceAutor {
public static void main(String[] args) {
String template = "nome1, sobrenome1, inutil11, inutil21, inutil31; nome2, sobrenome2, inutil12, inutil22, inutil32; nome3, sobrenome3, inutil13, inutil23, inutil33;";
System.out.print( "Antes: " );
System.out.println(template);
String[] templateArray = template.trim().split("\s*;\s*");
StringBuffer buffer = new StringBuffer();
for( String templateAutor : templateArray ) {
String novoTemplateAutor = templateAutor.replaceAll( "^([^,]*),([^,]*).*$","$1,$2" );
buffer.append( novoTemplateAutor );
buffer.append( ";" );
}
String novoTemplate = buffer.toString();
System.out.print( "Depois: " );
System.out.println(novoTemplate);
}
}
Em groovy:
def txt = 'nome1, sobrenome1, inutil11, inutil21, inutil31; nome2, sobrenome2, inutil12, inutil22, inutil32; nome3, sobrenome3, inutil13, inutil23, inutil33'
println "Antes: $txt"
def txtArray = txt.trim().split(/\s*;\s*/) as List
def result = ''
txtArray.each{ txtNovo ->
result += txtNovo.replaceAll(/^([^,]*),([^,]*).*$/, /$1,$2/) + ';'
}
println "Depois: $result"
