4

Javaで単純な再帰メソッドを使用して解決した、かなり厄介な問題があります。しかし、私はこれを行うためのより良い方法を探しています。

最初の問題は、Quoted Printable / Base64でエンコードされたMIMEヘッダー内に空白が存在することでした。これは、RFC2047仕様を読んだときに許可されていません。これは、空白が存在する場合、MIMEヘッダーのデコードが失敗することを意味します。

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

またはより適切に:

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

目標は、=?の間の空白のみを削除することです。?=境界(または= 20を使用して再エンコード)。これ以外の他のテキストは保持する必要があります。

私はこれを解決するための代替アプローチを探しています。これのターゲット言語はJavaです。これに対する最も単純でクリーンなアプローチに関するアイデアはありますか?

4

4 に答える 4

2

=?の間にあるかどうかを追跡するために、単純なステートマシンを構築できます。および?=、次に入力文字を文字ごとに読み取り、必要に応じて空白を文字変換して文字ごとに出力します。

于 2009-05-05T17:07:28.597 に答える
0

正規表現http://java.sun.com/docs/books/tutorial/essential/regex/

\s=空白
\S=非空白
\?=疑問符をエスケープしました
。=すべての文字。弱いパターンマッチングの*と同様です。

次のようなものを使用して、複数の部分からなる検索と置換を行うのが最も簡単な場合があります。この部分を引き出します:= \?。\?=

その部分の\sをグローバルに空の文字列に置き換えます。

パーツを元に戻します。

十分な長さの正規表現で遊んでいれば、それを1回の検索にまとめて、置き換えることができるかもしれません...

于 2009-05-05T17:04:37.790 に答える
0

まあ、私はより良いことについてはわかりませんが、ここに別のアプローチがあります:

    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();
    }
于 2009-05-05T18:48:28.120 に答える
-1

文字列を?で分割してから元に戻し、スペースを置き換えるかどうかを交互に切り替えることができます。

編集:おっと。等号を逃した。修正します。

編集2:修正された実装(Matcher.appendReplacement()のJavadocの例から派生):

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());
于 2009-05-05T17:11:25.090 に答える