Pregunta

Tengo un problema bastante molesto que resolví utilizando un método recursivo simple en Java. Sin embargo, estoy buscando una mejor manera de hacer esto.

El problema inicial consistía en la presencia de espacios en blanco dentro de un encabezado Mime codificado en Quoted Printable / Base64, que mientras leía la especificación RFC 2047, no está permitido. Esto significa que la decodificación falla para un encabezado MIME cuando hay espacios en blanco, por ejemplo,

=?iso-8859-1?Q?H=E4 ll and nothing?=

o más pertinente:

=?iso-8859-1?Q?H=E4 ll?= preserve this text =?iso-8859-1?Q?mo nk ey?=

El objetivo es eliminar solo los espacios en blanco entre el =? ? = límites (o recodificar utilizando = 20). Otro texto fuera de este debe ser preservado.

Estoy buscando enfoques alternativos para resolver esto. Mi idioma de destino es Java. ¿Alguna idea sobre el enfoque más simple y limpio de esto?

¿Fue útil?

Solución

Podrías construir una máquina de estado simple para rastrear si estás entre =? y? =, luego lea la entrada char por char y imprímala char by char convirtiendo espacios en blanco cuando sea necesario ...

Otros consejos

Expresiones regulares http://java.sun.com/docs/ books / tutorial / essential / regex / .

\ s = espacio en blanco
\ S = espacio no en blanco
\? = signo de interrogación de escape
. = todos los caracteres, similar a * en la coincidencia de patrón más débil.

Podría ser más fácil hacer una búsqueda y reemplazo de varias partes utilizando algo como esto: Saque esta parte: = \?. \? =

Reemplace globalmente \ s en esa parte con una cadena vacía.

Devuelva la pieza.

Es posible que puedas reducirlo a una sola búsqueda y reemplazarlo si juegas con la expresión regular el tiempo suficiente ...

Bueno, no sé nada mejor, pero aquí hay un enfoque alternativo:

    public static void main( String[] args )
    {
        String ex1 = "=?iso-8859-1?Q?H=E4 ll?= " + 
            "preserve this text =?iso-8859-1?Q?mo nk ey?=";
        String res1 = removeSpaces( ex1 );

        System.out.println( ex1 );
        System.out.println();
        System.out.println( res1 );
    }

    public static String removeSpaces( String str )
    {
        StringBuffer result = new StringBuffer();
        String strPattern = "(\\?.+\\?)";
        Pattern p = Pattern.compile( strPattern );
        Matcher m = p.matcher( str );

        if ( !m.find() || m.groupCount() == 0 )
        { // Contains no matching sequence.
            return str;
        }

        for ( int i = 1; i <= m.groupCount(); i++ )
        {
            m.appendReplacement( result, 
                m.group( i ).replaceAll( "\\s", "" ) );
        }

        return result.toString();
    }

¿Podrías dividir la cadena en?, luego volver a unirla, alternando entre reemplazar espacios y no.

Editar: Oops. Se perdieron los signos de igualdad. Lo corregiré.

Edit 2: implementación corregida (derivado del ejemplo de Javadoc para Matcher.appendReplacement ()):

String input = "=?iso-8859-1?Q?H=E4 ll?= what about in this case? :) =?iso-8859-1?Q?mo nk ey?=";

Pattern p = Pattern.compile("=\\?(.*?)\\?=");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group().replaceAll(" ", ""));
}
m.appendTail(sb);
System.out.println(sb.toString());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top