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?

Foi útil?

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());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top