Presentación y duda sobre programa en java

Iniciado por r00t_access, Junio 02, 2015, 07:18:50 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 02, 2015, 07:18:50 AM Ultima modificación: Junio 03, 2015, 09:20:54 AM por blackdrake
Muy buenas,

aprovecho esta ocasión para presentarme y para preguntar una duda que no logro resolver... :S

Mis mas sinceras felicitaciones por la pagina, me ha ayudado bastante :D


Mi duda:

Estoy jugando con regex y aprendiendo a programar en java, lo que me gustaría es saber como podría hacer para encontrar todos los links en un archivo de texto plano y una vez que se hayan encontrado sustituir el "http://" por un "[" y al final del link poner también un "[". quedaría algo así:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta -> [www.google.es]

Por ahora tengo clara mas o menos la regex, que sería esta:
"(https?)://(www\\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?" // Así también abarco los links https

Pero lo que me falla es como poder encontrar todos los links que hay en el txt y sustituir los "http://" por "[" :S

En ejemplos como este me queda claro pero de aquí no salgo:

Código: java
public class Replace {

        public static String replace(String str, String search, String replace) {
                return str.replaceAll(search, replace);
        }

        public static void main(String[] args) {

                String sURL = "http://www.google.com";
                String new_URL = replace(sURL,"http://","[");
                System.out.println(new_URL+ "]");

        }

}



Alguien podría ayudarme :)

Un saludo!


Update:  He conseguido modificar el "http://" por un "[" así:
Código: java
    String Link = "(https?)://(www\\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?";
       
       Pattern patternLink = Pattern.compile(Link);
       Matcher matcherLink = patternLink.matcher(s);
       
       if (matcherLink.find()){
       LinkSearch=matcherLink.group();
           String LinkSearch_replace= replace(LinkSearch,"http://","[");
       return LinkSearch_replace;


Sin embargo cuando en la main llamo a la clase del buscador de links e imprimo el link  para que termine con un "]" tengo que hacer un System.out.print(Link + "]");
Así que mi duda actual se resume en:
-Como buscar todos links en un archivo txt.
-Como añadir el "]" al final del link sin el método que he usado(System.out.print).

Gracias!! :)

Junio 02, 2015, 11:50:58 AM #1 Ultima modificación: Junio 02, 2015, 11:58:07 AM por Hu3c0
Hola amigo hace como 8 meses que por motivos de estudios no he tocado java, pero voy a hecharte una mano porque yo me volví loco con los Regex,hasta que comprendí que no era muy difícil.

Comparto el ejercicio que hice y añadiré unas lineas de código de cómo lo haría yo:
Código: java

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class EjercicioRegex {
   
    public static void main(String []args){
    String textoaextraer="[url=http://alkuytem.com/up//uploads/images/alkuytem-com-d77a9995a4.jpeg][img]http://alkuytem.com/up//uploads/images/alkuytem-com-d77a9995a4.jpeg[/img][/url]";
    String pattern = "\\[url\\=(.+?)\\]\\[img\\](.*?)\\[\\/img\\]\\[\\/url\\]";
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(textoaextraer);
    if (m.find()){
    System.out.println(m.group(0));
    System.out.println(m.group(1));
            System.out.println(m.group(2));
            System.out.println("["  + m.group(2) + "]"); //Este es el ejemplo que te interesa
           
    }
    else {
            System.out.println("Matchers not found");
           
            }
 
    }
   
}

En No tienes permitido ver los links. Registrarse o Entrar a mi cuenta(0) me saca todo
En No tienes permitido ver los links. Registrarse o Entrar a mi cuenta(1) me saca esto  No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/uploads/images/alkuytem-com-d77a9995a4.jpeg
En esta línea de código System.out.println("["  + No tienes permitido ver los links. Registrarse o Entrar a mi cuenta(2) + "]"); me saldría así  [ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta/uploads/images/alkuytem-com-d77a9995a4.jpeg ]

Te aconsejo que le des un vistazo también a la librería j.soup te facilitará mucho el camino a la hora de extraer de un DOM

Espero haberte sido de utilidad.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Junio 02, 2015, 12:05:29 PM #2 Ultima modificación: Junio 02, 2015, 12:07:53 PM por elmoyer
Gracias por el ejemplo compañero! La verdad es que las regex son bastante útiles cuando se aprende a programar con ellas :D

Sabrías decirme como podría encontrar todos los links de un archivo txt para poder realizar luego las modificaciones de los corchetes? :) 
Es decir en vez de dar una cadena String y definir su valor, decir que busque dentro de un txt todo aquello que se asemeje a la regex: "(https?)://(www\\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?"
(el txt tiene mas de 58800 lineas)


Un saludo!

Hola nuevamente bueno no sé como tienes ese archivo .txt pero si fuera así :
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Lo que haría sería leer el archivo con FileReader
File archivo = new File ("C:\\archivo.txt");
FileReader fr = new FileReader (archivo);
BufferedReader br = new BufferedReader(fr);
...
String linea = br.readLine();

Y a partir de aqui utilizaría el ejemplo que te he expuesto arriba es decir crearía el pattern luego matcher leería linea que es el String del archivo txt y luego  con m.groupv() extraería la parte que me interesa del String, finalmente lo imprimiría  bien con un System.out.println o bien utilizaría FileWrite y lo escribiría en un archivo .txt de salida con los Strings limpios.

Espero haberte ayudado te haría el código pero así no aprenderias es mejor que te muestre el camino y tú que muevas  las neuras un poco, yo también  lo hago así, hay veces que me atranco en una cosa, lo dejo y luego retomo hasta que lo consigo la satisfacción de conseguir las cosas por tus medios con un poquito de ayuda compensará tu esfuerzo.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: java

package org.underc0de.regextest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
*
* @author Gustavo
*/
public class RegexLinkEditor {

    private final String REGEX = "(https?)://";
    private final String FILE_PATH = "D://links.txt";
    private final List<String> newLines = new ArrayList<>();
    private boolean hasLinks;
   
    public void run() throws IOException {
        boolean exists = IOUtils.exists(FILE_PATH);
        if (exists) {
            evaluate();
        } else {
            System.out.println("I'm sorry. The request file was not found.");
            System.exit(-1);
        }
    }

    /*
     * Si el archivo tená links, se escriben en el archivo
     * los links con el nuevo formato: [www.xyz.com]
    */
    private void evaluate() throws IOException {
        execute();
        if (hasLinks) {
            IOUtils.writeLines(newLines, FILE_PATH);
        } else {
            System.out.println("Not links found");
        }
    }

    private List<String> execute() throws IOException {
        List<String> oldLines = IOUtils.getAllLinesOf(FILE_PATH);
        Pattern pattern = Pattern.compile(REGEX);
       
        oldLines.stream().map((current) -> {
            Matcher matcher = pattern.matcher(current);
            String newLine = current;
            if (matcher.find()) {
                if(hasLinks == false) hasLinks = true; // cambia la bandera indicando que hay links
                newLine = replace(current);
            }
            return newLine;
        }).forEach((newLine) -> {
            newLines.add(newLine);
        });

        return newLines;
    }

    private String replace(String line) {
        String newLine = line.replaceAll(REGEX, "[") + "]";
        return newLine;
    }
}


Código: java

package org.underc0de.regextest;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
*
* @author Gustavo
*/
public class IOUtils {

    public static boolean exists(String path) {
        return new File(path).exists();
    }

    public static List<String> getAllLinesOf(String path) {
        List<String> lines = new ArrayList<>();
        try {
            lines =  Files.readAllLines(Paths.get(path), Charset.forName("UTF-8"));
        } catch (IOException e) {
            ExceptionUtils.showException(e);
        }
        return lines;
    }

    public static void writeLines(List<String> lines, String path) {
        try (BufferedWriter bw = new BufferedWriter
            (new PrintWriter(path))) {
            for(String line : lines) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
        } catch(IOException e) {
            ExceptionUtils.showException(e);
        }
    }
}


Código: java

package org.underc0de.regextest;

import java.io.PrintWriter;
import java.io.StringWriter;

/**
*
* @author Gustavo
*/
public class ExceptionUtils {

    public static void showException(Exception e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        String exceptionText = sw.toString();
        System.out.println(exceptionText);
    }
}


Código: java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.underc0de.regextest;

import java.io.IOException;

/**
*
* @author Gustavo
*/
public class Main {
    public static void main(String[] args) {
        try {
            RegexLinkEditor editor = new RegexLinkEditor();
            editor.run();
        } catch (IOException e) {
            ExceptionUtils.showException(e);
        }
    }
}


Éste código hace lo que quieres. Lo hice en unos minutos solamente, ya verás por qué.

Hay un problema con éste código y es que, aunque detecte un link, reescribirá todas las 52k líneas, cosa que no es óptimo. Vale la pena si tienes al menos 100. Claro que se puede optimizar, pero eso te lo dejo a ti, como que practicas.

Sr Gus Garsaky estoy deseoso de seguir viendo sus tutoriales de Java, están muy bien explicados y son de fácil comprensión, con ellos siempre se queda algo positivo, muchas gracias.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muchas gracias Hu3c0. De hecho, estoy en ello ahora; no pude realizar nada las 2 últimas semanas por problemas personales pero trataré de hacer un par de post grandes (de 5-6 temas) para poner el curso al día.

Un saludo.

A la espera estoy y gracias por su gran labor
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta