2014-09-08 3 views
1

패턴을 기반으로하는 런 - 길이 인코딩을 수행하는 가장 깨끗한 방법을 찾고 있습니다. 목표는 여러 개의 동일한 패턴으로 구성된 하위 문자열을 인수 분해하여 문자열을 압축하는 것입니다.패턴 실행 길이 인코딩

원본 문자열 : 당신이 볼 수 있듯이

start{3}{3}{3}{3}end 

, 4 "{3}"패턴이 있습니다. 4 "{3}"패턴을 $4{3}으로 표시하여이 문자열을 압축 할 수 있습니다.

압축 된 문자열 내가 얻을 싶습니다

start$4{3}end 

은 내가 String.replaceAll(regex, replacement) 방법을 시도했다. 나는 myString.replaceAll("\\{([^<])\\}", "$1")이 그 값에 의해서만 전체 패턴을 대체 할 수 있다는 것을 알고 있지만 정규 표현식을 사용하여 동일한 패턴 실행을 감지하고 카운트하는 방법을 찾을 수 없다.

정규 표현식을 사용하고 있습니까? 아니면이를 수행하는 '더 좋은'방법이 있습니까?

+2

패턴 및 매처를 사용하고 그룹 수를 얻을 수 없습니까? –

답변

1

다음과 같이 출력됩니다. 이보다 효율적인 접근 방법이 있어야합니다. 하지만 잘하면이 도움이 될 것입니다

String s = "start{3}{3}{3}{3}end"; 
    String pString = "\\{3\\}"; 
    Pattern p = Pattern.compile(pString); 
    Matcher m = p.matcher(s); 

    int count = 0; 
    while (m.find()) { 
     count++; 
    } 
    System.out.println(s.replaceAll(pString, "-").replaceFirst("-{"+count+"}", "\\$"+count+pString)); 
+0

작업을 시작하기에 좋은 출발점이되어야합니다. 도움을 주셔서 감사합니다! – ponponke

+0

다행 그것은 당신을 도와줍니다 :) –

2

당신은 아마 (당신이 압축 될 데이터에 대한 지식을 사용하지 않는 한) 자신의 압축 알고리즘을 작성하는 것보다 더 나은 당신의 문자열을 gunzip이/gzip을 위해 ByteArrayInputStreamByteArrayOutputStream과 함께 java.util.zip.GZIPInputStreamjava.util.zip.GZIPOutputStream를 사용할 수 있습니다.