[정규표현식 - Easy]

import java.util.regex.Pattern;

/**
 * 
 * <PRE>
 * [실습] 주어진 개인정보를 마스킹하여 출력한다.
 * 
 * - 이름은 첫 글자와 마지막 글자만 남기고 나머지 글자를 마스킹 처리한다.
 * - 주민등록번호는 생년월일과 성별 부분만 남기고 나머지 숫자를 마스킹 처리한다.
 * - 카드 정보는 총 16자리 중, 앞의 6자리만 남기고 나머지 숫자를 마스킹 처리한다.
 * 
 * 
 * [실행 결과]
 * 김아무개 >> 김**개
 * 801104-1042758 >> 801104-1******
 * 1234-2345-3467-4578 >>1234-23**-****-****
 * 
 * </PRE>
 *
 * @author 74765
 * @version 1.0
 */
public class Test01 {

	private static final String result_name = "결과 : %s >> %s";

	private static final String result_juminNo = "결과 : %s >> %s";

	private static final String result_cardNo = "결과 : %s >> %s";

	public static void main(String[] args) {
		// 시작시간 기록
		long startTime = System.currentTimeMillis();

		// STEP 1. TEST 데이터 준비
		String original_name = "김아무개";
		String original_juminNo = "801104-1042758";
		String original_cardNo = "1234-2345-3467-4578";

		// STEP 2. 실행
		String masking_name = MaskingInfo(original_name);
		System.out.println(String.format(result_name, original_name, masking_name));
		String masking_juminNo = MaskingInfo(original_juminNo);
		System.out.println(String.format(result_juminNo, original_juminNo, masking_juminNo));
		String masking_cardNo = MaskingInfo(original_cardNo);
		System.out.println(String.format(result_cardNo, original_cardNo, masking_cardNo));

		// 종료시간 기록
		long endTime = System.currentTimeMillis() - startTime;
		System.out.println("소요시간 : " + endTime + "ms.");

	}

	/**
	 * 
	 * <PRE>
	 * 주어진 개인정보를 마스킹하여 출력한다
	 * </PRE>
	 * 
	 * @param originalStr
	 *            : 입력 문자열
	 * @return 마스킹 처리된 문자열
	 */
	public static String MaskingInfo(String originalStr) {
		// STEP 0. 패턴 준비
		String regx_name = "^[가-힣]{2,}$";
		String regx_juminNo = "^(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))-[1-4][0-9]{6}$";
		String regx_cardNo = "^\\d{4}[-]\\d{4}[-]\\d{4}[-]\\d{4}$";

		// STEP 1. 들어온 문자열 분리
		int length = originalStr.length();
		char[] characters = originalStr.toCharArray();

		// STEP 1-1. 이름 마스킹 처리
		if (Pattern.matches(regx_name, originalStr)) {
			for (int inx = 1; inx < length - 1; inx++) {
				characters[inx] = '*';
			}

		// STEP 1-2. 주민번호 마스킹 처리
		} else if (Pattern.matches(regx_juminNo, originalStr)) {
			for (int inx = 8; inx < length; inx++) {
				characters[inx] = '*';
			}

		// STEP 1-3. 카드번호 마스킹 처리
		} else if (Pattern.matches(regx_cardNo, originalStr)) {
			for (int inx = 7; inx < length; inx++) {
				if (characters[inx] != '-') {
					characters[inx] = '*';
				}
			}
		}

		// STEP 2. 결과 반환
		return String.valueOf(characters);

	}
}