중복문자 제거(정규표현식)

중복문자 제거(정규표현식)

소스코드

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.