Expresión regular en java para reemplazar un patrón en varias líneas

Quiero reemplazar esta entrada de archivo a una tabla html:

        ip add                  St Stat  Type Mode   ip only       class  numbers   
 ------------------------------ -- ----- ---- ---- --------------- ------ -----  
 ABC_127.562.200.5/32           -    up  ABC  -    127.562.200.5          5      
 ABC_127.292.200.3/32           -    up  ABC  -    127.562.200.5          4      
 ABC_127.262.200.13/32          -    up  ABC  -    127.562.200.5          3  
 ABC:jdnsajkds

Sé que esto terminará con "ABC", pero no puedo entender por qué "/" también aparece en la entrada.

import java.util.regex.*;


interface LogExample {

    public static final int NUM_FIELDS = 7;


    public static final String logEntryLine = "ABC_127.562.200.5/32 **space**        -- **space**    up **space**  ABC **space** -- **space**    127.562.200.5 **space**         5 **space** ";

}


public class LogRegExp implements LogExample {

    public static void main(String argv[]) {

        String logEntryPattern = "";//thats i am not getting

        System.out.println("Using RE Pattern:");
        System.out.println(logEntryPattern);

        System.out.println("Input line is:");
        System.out.println(logEntryLine);

        Pattern p = Pattern.compile(logEntryPattern);
        Matcher matcher = p.matcher(logEntryLine);
        if (!matcher.matches() || 
                NUM_FIELDS != matcher.groupCount()) {
            System.err.println("Bad log entry (or problem with RE?):");
            System.err.println(logEntryLine);
            return;
        }
        System.out.println("name + IP Address: " + matcher.group(1));
        System.out.println("status1: " + matcher.group(2));
        System.out.println("status2: " + matcher.group(3));
        System.out.println("type: " + matcher.group(4));
        System.out.println("mode: " + matcher.group(5));
        System.out.println("IP Address: " + matcher.group(6));
        System.out.println("class: " + matcher.group(7));
        System.out.println("numbers: " + matcher.group(8));

    }
}

preguntado el 22 de mayo de 12 a las 19:05

+1 @EugeneKuleshov por mejorar sus posibilidades de obtener una respuesta :) -

¿Qué has probado ya? Parece que tiene algún código que divide la entrada en espacios en blanco, pero el carácter de barra inclinada en la primera columna lo está tropezando. -

no, en realidad no tengo idea de qué hacer con esto. pero esto es la salida de un archivo. que terminará con "ABC: "+alguna cadena. -

¿Alguien puede proporcionar una expresión regular que analizará estas 6 columnas diferentes de acuerdo con sus valores?

@devilsam: las expresiones regulares coinciden con cadenas, no las "analizan", su programa debería hacer eso. Qué exactamente estás tratando de hacer? Muéstrenos su código actual y díganos qué hace y qué necesita exactamente. lo quiero hacer... -

2 Respuestas

Dado que la columna de su clase está en blanco, no podemos hacer mucho para extraer esa información. Pero esta expresión regular coincidirá con las 7 columnas de datos que tiene:

    String logEntryPattern = "(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)";

Necesitamos escapar de la barra invertida en el literal de cadena de Java.

    System.out.println("name + IP Address: " + matcher.group(1));
    System.out.println("status1: " + matcher.group(2));
    System.out.println("status2: " + matcher.group(3));
    System.out.println("type: " + matcher.group(4));
    System.out.println("mode: " + matcher.group(5));
    System.out.println("IP Address: " + matcher.group(6));
    System.out.println("numbers: " + matcher.group(7));

Francamente, una expresión regular es un poco demasiado para lo que está tratando de hacer, así que solo tokenizar espacios funcionaría igual de bien, pero hace el trabajo.

contestado el 22 de mayo de 12 a las 23:05

Tengo la solución:

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

public class RegexMatches
{
    public static void main( String args[] )
    {
        // String to be scanned to find the pattern.
        // String line = "MSEM-E-031_TO_RVBC-R-001_T1    en   up  TE   ingr 124.252.200.2   ELSP   0";
        // String pattern = "((\\-{8})+.*?)";
        String line = "ADR-SSF-1008-M008              vlan  en dn 10081008";
        String pattern = "((\\-{6})+.*?)";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);
        if (m.find( ))
        {
            System.out.println("Found value: " + m.group(0) );
            System.out.println("Found value: " + m.group(1) );
            System.out.println("Found value: " + m.group(2) );
        }
        else
        {
            System.out.println("NO MATCH");
        }
    }
}

contestado el 28 de mayo de 12 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.