Expressao regular

4 respostas
hcbelias

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?

4 Respostas

wbdsjunior

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", "");
T

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.

maluko

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);
	}
}
neofito

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"

:smiley:

Criado 15 de outubro de 2008
Ultima resposta 15 de out. de 2008
Respostas 4
Participantes 5