텍스트 경계 내의 표현식을 교체하십시오
문제
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());