문제

Java에서 간단한 재귀 방법을 사용하여 해결 한 다소 성가신 문제가 있습니다. 그러나 나는 이것을 할 수있는 더 좋은 방법을 찾고 있습니다.

초기 문제는 인용 된 인쇄 가능한/base64 인코딩 된 MIME 헤더 내에 공백의 존재와 관련이 있습니다. RFC 2047 사양을 읽을 때 허용되지 않습니다. 이것은 공백이있을 때 마임 헤더에 디코딩이 실패한다는 것을 의미합니다.

=?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을 사용하여 다시 인코딩). 이 외부의 다른 텍스트는 보존되어야합니다.

나는 이것에 대한 내 목표 언어를 해결하기위한 대체 접근법을 찾고 있습니다. 이것에 대한 가장 단순하고 깨끗한 접근 방식에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

사이에있는 경우 간단한 상태 머신을 구축 할 수 있습니다. 그리고? =, 그런 다음 숯으로 입력 숯을 읽고 필요할 때 숯을 변환하여 숯을 출력합니다 ...

다른 팁

정규 표현 http://java.sun.com/docs/books/tutorial/estential/regex/.

s = 공백
s = 비 분열
? = 탈출 된 물음표
. = 약한 패턴 일치에서 *와 비슷한 모든 문자.

다음과 같은 것을 사용하여 멀티 파트를 찾아서 교체하는 것이 가장 쉬울 수 있습니다.이 부분을 꺼내십시오 : = ?. ? =

그 부분의 빈 문자열로 전 세계적으로 대체하십시오.

부품을 뒤로 두십시오.

당신은 그것을 단일 검색으로 가져 가서 REGEX와 충분히 놀면 교체 할 수 있습니다 ...

글쎄, 나는 더 잘 모르겠지만 여기에 대체 접근법이 있습니다.

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

문자열을 켜질 수 있습니까? 그런 다음 다시 합치고 공백을 교체하지 않고 교체합니다.

편집 : 죄송합니다. 동등한 징후를 놓쳤다. 수정 될 것입니다.

편집 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());
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top