Frage

Ich habe ein ziemlich ärgerliches Problem, das ich mit einer einfachen rekursive Methode in Java gelöst. Aber ich bin auf der Suche nach einem besseren Weg, dies zu tun.

Das anfängliche Problem betraf die Anwesenheit von Leerzeichen innerhalb eines Quoted Printable / Base64 codiert Mime-Header - die, wie ich die RFC 2047 Spezifikation lesen - ist nicht erlaubt. Dies bedeutet, dass eine Decodierung für einen MIME-Header schlägt fehl, wenn Leerzeichen vorhanden ist, z.

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

oder mehr einschlägig:

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

Das Ziel ist es, nur die Leerzeichen zwischen den = zu entfernen? ? = Grenzen (oder Re-Encoding = 20 verwendet wird). Anderer Text außerhalb dieser aufbewahrt werden sollte.

Ich bin für alternative Ansätze suchen, um diese meine Zielsprache für diese zu lösen, ist Java. Irgendwelche Ideen auf, die einfachste, sauberste Ansatz dazu?

War es hilfreich?

Lösung

Sie können eine einfache Zustandsmaschine zu verfolgen bauen, wenn Sie zwischen = sind? und? =, dann lesen Sie das Eingabezeichen von Zeichen und gibt es Zeichen von char konvertieren Leerzeichen bei Bedarf ...

Andere Tipps

Reguläre Ausdrücke http://java.sun.com/docs/ Bücher / tutorial / essential / regex / .

\ s = Leerzeichen
\ S = kein Leerzeichen
\? = Entkam Fragezeichen
. = Alle Zeichen, ähnlich wie * in schwächerem Pattern-Matching.

könnte am einfachsten ein mehrteiliger zu tun finden und ersetzt so etwas wie dies mit: Ziehen Sie diesen Teil:?.? = \ \ =

Global ersetzen \ s in diesem Teil mit leeren String zurück.

Setzen Sie den Teil zurück.

Das könnte Sie der Lage sein, es zu bekommen, um eine einzige Suche nach unten und ersetzen, wenn Sie mit dem regex spielen lange genug ...

Nun, ich weiß ja nicht besser, aber hier ist ein alternativer Ansatz:

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

Sie können die Zeichenfolge aufgeteilt auf?, Es wieder zusammenzusetzen, im Wechsel zwischen den Räumen zu ersetzen und nicht.

Edit: Ups. Verpasste die Gleichheitszeichen. Wird korrigieren.

Edit 2: Korrigierte Implementierung (abgeleitet von Javadoc Beispiel für 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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top