Code contest

Nao eh beeeem um code contest. Eh um “mostre como eh facil tornar codigo em qualquer linguagem ilegivel quando vc usa expressoes regulares”. :wink:

Se o carinha que for ver o código não conhecer absolutamente nada de regular expressions, nem que fossem separadas em 3 regexp diferentes, ou feito qualquer tipo de bruxaria o baiano ia entender o que significa. E sim, “code contest” é só um nomezinho tosco pra uma categoria mais tosca ainda. Ah claro, sem contar que num concurso normalmente existe um ganhador.

Carlos,

porque não posta la um código legível e fácil?

Como o Villela disse, Regexp torna qualquer pedaço de código bem feito em um lixo ilegível. Tanto é que eu nem questionei a regexp que o Diego fez para o exemplo dele em Ruby. Apenas copiei e colei na minha versão Groovy (que ficou um lixo e ainda não pude testar).

Agora, sobre a opinião do Luca: eu achei a versão em Python muito bonitinha. A versão em Ruby também. Mesmo a versão Java 5.0 ficou show de bola (o que ajuda a calar algumas vozes que dizem que Java é muito ruim para processamento de texto - Ok, não é a melhor coisa do mundo para processamento de texto, mas não é de todo ruim também). O que me deixou realmente impressionado (pelo lado negativo) foi o fato de o objeto java.net.URLConnection não possuir um user-agent padrão (o que me faz pensar se aquele script em Groovy vai funcionar ou não).

Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…

ele possui um UserAgent padrão, só que o google da um erro 403 se usar o padrão, pq ele filtra “robos de busca” que possam ser feitos em java.
se não fosse isto, dava pra usar url.openStream() direto :smiley:

[quote=flaleite]Falando em RegEx acabo de ficar p*** da vida com o java.util.regex.

        Pattern pKey = Pattern.compile("PA");
        
        Matcher mKey = pKey.matcher("PATO");
        return mKey.find();

O dito não tem o comportamento das outras implementações de Reg Ex e retorna true (o correto seria false). Para fazer ele trabalhar da maneira correta tem que acrescentar “^PA$”.

abs.,
Flávio Suguimoto[/quote]

Flávio, ajuda você aprender a usar a API corretamente. Senão fica a impressão que você não sabe do que está falando e simplesmente está reclamando sem razão.

Leia a API da classe Matcher, você vai notar que find() e match() se comportam de formas diferentes.

[quote=giulianocosta]Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…[/quote]

http://tusker.org/regex/regex_benchmark.html

[quote=flaleite]Falando em RegEx acabo de ficar p*** da vida com o java.util.regex.

        Pattern pKey = Pattern.compile("PA");
        
        Matcher mKey = pKey.matcher("PATO");
        return mKey.find();

O dito não tem o comportamento das outras implementações de Reg Ex e retorna true (o correto seria false). Para fazer ele trabalhar da maneira correta tem que acrescentar “^PA$”.

abs.,
Flávio Suguimoto[/quote]

O find ele procura a expressão em um determinado texto, se você usar macthes ele deverá retornar false!

[quote=Daniel Quirino Oliveira][quote=giulianocosta]Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…[/quote]

http://tusker.org/regex/regex_benchmark.html[/quote]

Daniel, eu me referia a algo que não tenha que trabalhar com expressões regulares. E não outras implementações de Expressões Regulares. Mas mesmo assim valeu pela dica dos benchmarks

Olá:

Aqui vai a minha versão em Groovy:

"http://www.google.com".toURL().eachLine{
	it.eachMatch("<a(.*?)href=(\\"|)(.*?)(\\"|)(.*?)>(.*?)</a>"){println  "* " + it[6] + " --> " + it[5]}
}

A Resposta:

* Página inicial personalizada --> /url?sa=p&pref=ig&pval=2&q=http://www.google.com.br/ig%3Fhl%3Dpt-BR"
* Efetuar login --> https://www.google.com/accounts/Login?continue=http://www.google.com.br/&hl=pt-BR"
* Imagens --> /imghp?hl=pt-BR&tab=wi&ie=UTF-8"
* Grupos --> http://groups.google.com.br/grphp?hl=pt-BR&tab=wg&ie=UTF-8"
* Diretório --> /dirhp?hl=pt-BR&tab=wd&ie=UTF-8"
* Notícias<sup><a	style="text-decoration:none"><font	color=red>Novo!</font> --> http://news.google.com.br/nwshp?hl=pt-BR&tab=wn&ie=UTF-8"
* mais&nbsp;&raquo; --> /intl/pt-BR/options/" class=q
* Pesquisa avançada --> /advanced_search?hl=pt-BR
* Preferências --> /preferences?hl=pt-BR
* Ferramentas de idiomas --> /language_tools?hl=pt-BR
* Soluções de publicidade --> /intl/pt/ads/
* Tudo sobre o Google --> /intl/pt-BR/about.html
* Google.com in English --> http://www.google.com/ncr

Alguma Observações:

  • Se eu tento http://www.google.com.br/search?q=groovy acabo obtendo um erro HTTP 403. será que o Google é capaz de barrar requisições que não venham de browsers?
  • Por que it[6] e it[5]? Confesso que não sei. Cheguei a eles por tentativa e erro. Se no closure do eachMatch tivesse usado simplesmente it.toString(), apareceria um array de Strings. Creio que deve ser algo haver com os i[/i]. Devo ler melhor a API de regex do Java.
  • Como podem ver não é a solução perfeita, pois anida aparecem as aspas finais do href.

Grato,

[quote=Rafael Afonso]Olá

Alguma Observações:

Olá Rafael, o Daniel explicou isso antes…

[quote=diego_sl][quote=Rafael Afonso]Olá

Alguma Observações:

Olá Rafael, o Daniel explicou isso antes…

Bem, nunca mexi com a classe java.net.URLConnection. Por isso nunca senti esse problema na pele, nem compreendi a observação do Daniel. Agora entendo.

Grato,

A classe URL do Groovy não é exatamente a java.net.URL. É uma extensão que foi criada baseada nesta classe. Quando você faz URL.eachLine() ou URL.getText() (como eu fiz), ele acaba usando um URLConnection por baixo dos panos para tratar as transações HTTP necessárias. Eu conversei com o Guillaume Laforge para se adicionar um delegate para o método URLConnection.setRequestProperty(String). Vamos ver no que dá.

Reload:
Contest desta semana é: http://nullability.org/?p=34

import java.io.*;
import java.util.*;
class RemoveArquivosVelhos {
    public static void main(String[] args) {
        final long ontem = new Date().getTime() - 7L * 24 * 3600 * 1000;
        for (File f : new File("/tmp/backup").listFiles(new FileFilter() {
            public boolean accept (File pathname) {
                return pathname.lastModified() < ontem;
            }
        })) {
            f.delete();
        }
    }
}

Eu sei, eu sei, poderia deletar o arquivo dentro do accept, mas não sei se o sistema operacional vai gostar muito disso. Prefiro montar a lista de arquivos a serem deletados, e depois deletar os arquivos.

EDIT - Aham, não tinha visto que era 1 semana (não 1 dia). Corrigido

Ainda não testei, usa Commons:

import java.io.File;
import java.util.Date;

import static org.apache.commons.io.FileUtils.* ;
import org.apache.commons.io.filefilter.AgeFileFilter ;

public class Backup {
    public static void main( String[] args ) {
        File dir = new File("/tmp/backup");
        Date lastWeek = new Date( System.currentTimeMillis() - 7L*3600*24*1000 );
        AgeFileFilter filter = new AgeFileFilter( lastWeek );
        for( Object f : listFiles( dir, filter, null ) ) ((File)f).delete();
    }
}

Edit: Testei e tinha esquecido de um parêntese. Acontece. Agora tá certinho.

Em C# (só compilei, não testei)

using System;
using System.IO;
public class RemoveArquivosVelhos {
    public static void Main(string[] args) {
        foreach (FileInfo fi in (new DirectoryInfo (@"\temp\backup")).GetFiles()) {
            if (((TimeSpan) (DateTime.Now - fi.LastWriteTime)).Days > 7) {
                fi.Delete();
            }
        }
    }
}

[quote=#@®®¡$]Ainda não testei, usa Commons:

[code]
import java.io.File;
import java.util.Date;

import static org.apache.commons.io.FileUtils.* ;
import org.apache.commons.io.filefilter.AgeFileFilter ;

public class Backup {
public static void main( String[] args ) {
File dir = new File("/tmp/backup");
Date lastWeek = new Date( System.currentTimeMillis() - 7L360024*1000 );
AgeFileFilter filter = new AgeFileFilter( lastWeek );
for( Object f : listFiles( dir, filter, null ) ((File)f).delete();
}
}
[/code][/quote]

Willerson,

Vc pode fazer a uma versão para os “rubyzeros” entenderem. :smiley:

 import java.io.File;
 import java.util.Date;
 
 import static org.apache.commons.io.FileUtils.* ;
 import org.apache.commons.io.filefilter.AgeFileFilter ;
 
 public class Backup {
     public static void main( String[] args ) {
         for( Object f : listFiles( new File("/tmp/backup"), new AgeFileFilter( new Date( System.currentTimeMillis() - 7L*3600*24*1000 ) ), null ) ((File)f).delete();
     }
 }

Brincadeirinha… Paz… :lol: :lol:

Uma outra versão em Groovy:

def limpaDir(nameDir, diasAtras) {
	def dir = new File(nameDir)	// Não precisa chamar import
	def diaMinimo = new Date() - diasAtras	//  O operador menos subtrai o número de dias
	dir.eachFile { if((new Date(it.lastModified())) < diaMinimo) {it.delete()}}
}

limpaDir("c:/temp", 5)
  • Não seria interessante ter um método String.toFile()? Funcionaria da mesma forma que String.toUrl().