Question

J'ai un problème plutôt ennuyeux que j'ai résolu à l'aide d'une méthode récursive simple en Java. Cependant, je cherche un meilleur moyen de le faire.

Le problème initial impliquait la présence d'espaces dans un en-tête Mime codé Quoted Printable / Base64, qui n'est pas autorisé lorsque je lis la spécification RFC 2047. Cela signifie que le décodage échoue pour un en-tête MIME quand un espace est présent, par exemple.

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

ou plus pertinemment:

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

Le but est de ne supprimer que les espaces entre les =? ? = frontières (ou ré-encoder en utilisant = 20). Tout autre texte en dehors de celui-ci doit être conservé.

Je cherche des solutions alternatives pour résoudre ce problème. Mon langage cible est Java. Des idées sur la solution la plus simple et la plus propre?

Était-ce utile?

La solution

Vous pourriez construire une machine à états simple pour suivre si vous êtes entre =? et? =, puis lit le caractère d'entrée par caractère et le renvoie caractère par caractère convertissant les espaces si nécessaire ...

Autres conseils

Expressions régulières http://java.sun.com/docs/ livres / tutorial / essential / regex / .

\ s = espaces blancs
\ S = espace non blanc
\? = point d'interrogation échappé
. = tous les caractères, semblables à * dans les correspondances les plus faibles.

Il serait peut-être plus facile de rechercher et de remplacer plusieurs éléments en utilisant quelque chose comme ceci: Tirez cette partie: = \?. \? =

Remplacer globalement \ s dans cette partie par une chaîne vide.

Remettez la pièce en place.

Vous pourrez peut-être faire une recherche simple et le remplacer si vous jouez avec l'expression régulière assez longtemps ...

Eh bien, je ne sais pas si c'est mieux, mais voici une autre approche:

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

Vous pouvez scinder la chaîne?, puis la reconstituer, en alternant entre remplacer des espaces et non.

Edit: Oups. Manqué les signes d'égalité. Va corriger.

Édition 2: implémentation corrigée (dérivée de l'exemple Javadoc pour 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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top