Substituir uma expressão dentro dos limites de texto
Pergunta
Eu tenho um problema muito chato que eu resolvido usando um método recursivo simples em Java. No entanto, estou procurando uma maneira melhor de fazer isso.
O problema inicial envolveu a presença de espaços em branco dentro de um citado para impressão / base64 codificado Mime cabeçalho - que, como li a especificação RFC 2047 - não é permitido. Isto significa que a descodificação falhar por um cabeçalho MIME ao espaço em branco está presente, por exemplo.
=?iso-8859-1?Q?H=E4 ll and nothing?=
ou mais pertinente:
=?iso-8859-1?Q?H=E4 ll?= preserve this text =?iso-8859-1?Q?mo nk ey?=
O objetivo é remover apenas o espaço em branco entre os =? ? = Fronteiras (ou recodificar utilizando = 20). Outro texto fora isso deve ser preservada.
Eu estou procurando abordagens alternativas para resolver este minha língua-alvo para isso é Java. Todas as ideias sobre a abordagem mais simples, mais limpa para isso?
Solução
Você poderia construir uma máquina de estado simples de rastrear se você está entre =? e? =, em seguida, ler o caractere de entrada de caractere e sua saída será CHAR, de char convertendo espaços em branco quando necessário ...
Outras dicas
As expressões regulares http://java.sun.com/docs/ livros / tutorial / essencial / regex / .
\ s = espaços em branco
\ S = não-espaço em branco
\? = Pergunta escapou marca
. = Todos os personagens, semelhantes a * em mais fraca correspondência padrão.
Pode ser mais fácil de fazer uma descoberta multi-parte e substituir usando algo parecido com isto: Retire esta parte:?.? = \ \ =
Globalmente substituir \ s em que parte com a corda vazia.
Coloque a parte de trás.
Você pode ser capaz de obtê-lo para baixo para uma única pesquisa e substituir se você jogar com o regex tempo suficiente ...
Bem, eu não sei quanto a melhor, mas aqui está uma abordagem alternativa:
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();
}
Você poderia dividir a string em?, Em seguida, colocá-lo novamente, alternando entre substituindo espaços e não.
Editar: Opa. Perdeu os sinais de igual. Corrigirá.
Editar 2: aplicação rectificado (derivado de exemplo Javadoc para 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());