我有一个相当讨厌的问题,我在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。关于最简单,最干净的方法的任何想法?
答案 0 :(得分:2)
您可以构建一个简单的状态机来跟踪您是否介于=之间?和?=,然后通过char读取输入char,并在需要时通过char转换空格来输出char ...
答案 1 :(得分:0)
正则表达式http://java.sun.com/docs/books/tutorial/essential/regex/。
\ s =空格
\ S =非空白
\? =逃脱的问号
。 =所有字符,类似于较弱模式匹配中的*。
使用以下内容可能最容易进行多部分查找和替换: 拉出这部分:= \?。\?=
用空字符串全局替换该部分中的\。
把部件放回去。
如果您使用正则表达式足够长时间,您可以将其归结为单个搜索并替换...
答案 2 :(得分: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();
}
答案 3 :(得分:-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());