2009-05-05 109 views
4

我有一个相当恼人的问题,我解决了在Java中使用简单的递归方法。不过,我正在寻找更好的方法来做到这一点。替换文本边界内的表达

最初的问题涉及在引用的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字符转换空格在需要时...

0

正则表达式http://java.sun.com/docs/books/tutorial/essential/regex/。 S =非空白
\? =转义问号
。 =所有字符,类似于较弱模式匹配中的*。

可能是最容易做的多部分发现和使用这样的替换: 拉出这一部分:??= \ \ =

全局替换\ S与空字符串的一部分。

放回部分。

你也许能够得到它归结为一个单一的搜索,如果你用正则表达式足够长的时间玩替换...

+0

你可以使用捕获组并迭代结果,但是在那个时候,你可能最好用简单的递归方法,我假设它基本上是pgras的状态机。 – steamer25 2009-05-05 18:19:53

-1

您可以拆分字符串?,然后将其放回到一起,交替替换空格而不是。

编辑:糟糕。错过了等号。将更正。

编辑2:纠正实施工作(例如的Javadoc导出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()); 
+0

=?iso-8859-1?Q?H = E4 ll?=在这种情况下呢? :) =?iso-8859-1?Q?mo nk ey?= – Jon 2009-05-05 17:18:42

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