2009-05-05 10 views
4

Javaで単純な再帰的メソッドを使用して解決したという厄介な問題があります。しかし、私はこれを行うためのより良い方法を探しています。テキスト境界内での式の置換

最初の問題は、Quoted Printable/Base64でエンコードされたMimeヘッダー(これはRFC 2047仕様を読んでいる)内に空白があることです。これは、空白が存在するときに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に解決するための代替アプローチを探しています。これに対する最もシンプルでクリーンなアプローチに関するアイデアはありますか?

答えて

2

あなたは=の間にある場合は、追跡するために、単純な状態マシンを構築することができますか?そして?=、入力されたcharをcharで読み込み、必要に応じてcharを空白に変換してcharを出力します。

0

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

\ S =空白
\ S =非空白
\? =エスケープされた疑問符
=より弱いパターンマッチングで*に似ているすべての文字。 この部分を引き出します:?

は、マルチパートが見つけると、このようなものを使用して交換する最も簡単なことかもしれません。?= \ \ =

グローバルに\が空の文字列と、その部分によ交換してください。

部品を戻します。

あなたは、単一の検索にそれを取得し、あなたが十分な長正規表現で遊ぶ場合は交換することができるかもしれません...

+0

キャプチャグループを使用して結果を反復処理することができますが、その時点では単純に再帰的な方法を使う方がよいでしょう。 – steamer25

-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()); 
+0

=?iso-8859-1?Q?H = E411?=この場合、どうなるでしょうか? :) =?iso-8859-1?Q?mo nk ey?= – Jon

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(); 
    } 
関連する問題