소스코드
package study.logic;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 문자열의 중복을 정규표현식을 이용해 압축하는 방법
*/
public class Deduplication {
public Deduplication() {
}
/**
* 특정조건에 맞는 연속된 문자열을 하나로 합치거나 단순 치환
*
*
*
* @param inputText
* 입력문자열
* @param duplicates
* 중복 수량
* @param replaceChar
* 치환 문자
* @param compress
* 압축여부( true : 조건에 맞는 문자열을 replaceChar하나로 치환, false : 조건에 맞는 문자열을 찾아 각각의 문자를 replaceChar로 치환 )
* @return
*/
public String deduplicate( String inputText, int duplicates, String replaceChar, boolean compress ) {
/*
* 정규식
*
* ex1) 동일문자가 2개의 연속된 문자열
* (.)\\1{1,}
*
* ex2) 동일문자가 3개의 연속된 문자열
* (.)\\1{2,}
*
* ex3) 동일문자가 4개의 연속된 문자열
* (.)\\1{3,}
*
* ...
*
* exN) 동일문자가 N개의 연속된 문자열
* (.)\\1{(N-1),}
*/
String regex = "(.)\\1{" + ( duplicates - 1 ) + ",}";
Pattern pattern = Pattern.compile( regex );
Matcher matcher = pattern.matcher( inputText );
StringBuffer stringBuffer = new StringBuffer();
String capturedGroup = "";
while( matcher.find() ) {
if( replaceChar == null ) {
if( compress ) {
capturedGroup = matcher.group().substring( 0, 1 );
} else {
capturedGroup = new String( new char[ matcher.group().length() ] ).replace( "\0", matcher.group() );
}
} else {
if( compress ) {
capturedGroup = replaceChar;
} else {
capturedGroup = new String( new char[ matcher.group().length() ] ).replace( "\0", replaceChar );
}
}
matcher.appendReplacement( stringBuffer, capturedGroup );
}
matcher.appendTail( stringBuffer );
return stringBuffer.toString();
}
/**
* n회 이상 연속된 문자열을 하나로 치환
*/
public String deduplicate( String inputText, int duplicates ) {
if( duplicates > 1 ) {
return this.deduplicate( inputText, duplicates, null, true );
}
return inputText;
}
/**
* 2회 이상 연속된 문자열을 하나로 치환
*/
public String deduplicate( String inputText ) {
return this.deduplicate( inputText, 2 );
}
public static void main( String[] args ) {
String inputText1 = "AASDEFFFFFFFEEFGALKJEGGGADFHEGLKJASDFEF";
String inputText2 = "122333444455555666666777777788888888999999999";
Deduplication example = new Deduplication();
System.out.println( "=============================" );
System.out.println( "원본 문자열1" );
System.out.println( inputText1 );
System.out.println( "=============================" );
System.out.println( "" );
System.out.println( "두개 이상 중복된 문자열 제거" );
System.out.println( example.deduplicate( inputText1 ) );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 압축( n = 2 )" );
System.out.println( example.deduplicate( inputText1, 2 ) );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 압축( n = 3 )" );
System.out.println( example.deduplicate( inputText1, 3 ) );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 압축( n = 3, 압축 )" );
System.out.println( example.deduplicate( inputText1, 3, "X", true ) );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 치환( n = 3, 단순치환 )" );
System.out.println( example.deduplicate( inputText1, 3, "X", false ) );
System.out.println( "" );
System.out.println( "" );
System.out.println( "=============================" );
System.out.println( "원본 문자열2" );
System.out.println( inputText2 );
System.out.println( "=============================" );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 압축( n = 9, 압축 )" );
System.out.println( example.deduplicate( inputText2, 9, "0", true ) );
System.out.println( "" );
System.out.println( "n개 이상 중복된 문자열 치환( n = 9, 단순치환 )" );
System.out.println( example.deduplicate( inputText2, 9, "0", false ) );
System.out.println( "" );
}
}
실행결과
=============================
원본 문자열1
AASDEFFFFFFFEEFGALKJEGGGADFHEGLKJASDFEF
=============================
두개 이상 중복된 문자열 제거
ASDEFEFGALKJEGADFHEGLKJASDFEF
n개 이상 중복된 문자열 압축( n = 2 )
ASDEFEFGALKJEGADFHEGLKJASDFEF
n개 이상 중복된 문자열 압축( n = 3 )
AASDEFEEFGALKJEGADFHEGLKJASDFEF
n개 이상 중복된 문자열 압축( n = 3, 압축 )
AASDEXEEFGALKJEXADFHEGLKJASDFEF
n개 이상 중복된 문자열 치환( n = 3, 단순치환 )
AASDEXXXXXXXEEFGALKJEXXXADFHEGLKJASDFEF
=============================
원본 문자열2
122333444455555666666777777788888888999999999
=============================
n개 이상 중복된 문자열 압축( n = 9, 압축 )
1223334444555556666667777777888888880
n개 이상 중복된 문자열 치환( n = 9, 단순치환 )
122333444455555666666777777788888888000000000
Written with StackEdit.