JAVA 정규 표현식 regex, Pattern 사용법 예제

자바로 정규식을 사용하고 싶은 경우에는 java.util.regex 를 사용 사용해야 합니다.

java.util.regex.Pattern 클래스에는 정규식에 관한 상세한 설명이 기술되어 있습니다.

 

POSIX 문자 클래스 (US-ASCII)

문법매칭
 \p{Lower} 소문자 영어:[a-z]
 \p{Upper} 대문자 영어: [A-Z]
 \p{ASCII} 모든 ASCII 문자: [\x00-\x7F]
 \p{Alpha} 엉어: [\p{Lower}\p{Upper}]
 \p{Digit} 10 진수: [0-9]
 \p{Alnum} 영어, 숫자: [\p{Alpha}\p{Digit}]
 \p{Punct} 특수 문자:!”,$%&'()*+,-./:;<=>?@[]^_`{
 \p{Graph} 표시 가능한 문자:[\p{Alnum}\p{Punct}]
 \p{Print} 프린터 가능한 문자:[\p{Graph}\x20]
 \p{Blank} 공백 또는 탭:[ \t]
 \p{Cntrl} 제어 문자:[\x00-\x1F\x7F]
 \p{XDigit} 16 진수:[0-9a-fA-F]
 \p{Space} 공백 문자:[ \t\n\x0B\f\r]

 

java.lang.Character 클래스 (단순 java 문자 타입)

문법매칭
 \p{javaLowerCase} java.lang.Character.isLowerCase() 와 같음
 \p{javaUpperCase} java.lang.Character.isUpperCase() 와 같음
 \p{javaWhitespace} java.lang.Character.isWhitespace() 와 같음
 \p{javaMirrored} java.lang.Character.isMirrored() 와 같음

 

Unicode 블록과 카테고리 클래스

문법매칭
 \p{InGreek} 그리스어 블록 문자 (단순 블록)
 \p{Lu} 대문자 (단순 카테고리)
 \p{Sc} 통화 기호
 \P{InGreek} 그리스어 블록 이외 문자(부정)
 [\p{L}&&[^\p{Lu}]] 대문자 이외 문자

 

자바 프로그래밍

실제 자바에서 정규식을 어떻게 사용하는지 예제를 보겠습니다.

public static void main(String args[]) {

	//대상 문자열
	String str = "123A5";

	//매칭시킬 정규식 패턴을 생성
	Pattern p = Pattern.compile("^[0-9]*$");
	Matcher m = p.matcher(str);

	//화면 표시
	System.out.println(m.find());

}

 

정규식 표현 샘플

문법매칭
 ^\d{10}$ 숫자 10 자리수에 매칭
 ^\d{8,10}$ 숫자 8자리 이상 10자리 이하 매칭
 ^[0-9a-zA-Z]+$ 1자리수 이상의 영어,숫자에 매칭
 ^\d{3}-\d{2}$ 우편번호(숫자 3자리 – 숫자 2자리)

 

자바 프로그램 샘플

정규식 패턴 오브젝트에 숫자와 문자, 우편번호등 여러 패턴의 정규식을 미리 정의하였습니다.

ExampleMatches.java

package com.openbooks.sample.marches;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 정규식을 확인하기 위한 클래스。
* 
* @author openbooks
* @since 0.0.1
*/
public class ExampleMatches {

	/**
	* 정규식 패턴 오브젝트
	*/
	public enum PatternEnum {
		/** 영어와 숫자만 가능: ^[a-zA-Z0-9]+$ */
		ALNUM("^[a-zA-Z0-9]+$"),
		/** 영어만 가능: ^[a-zA-Z]+$ */
		ALPHA("^[a-zA-Z]+$"),
		/** 모든 ASCII 문자: [\x00-\x7F] */
		ASCII("[\\x00-\\x7F]"),
		/** 10 진수 숫자만 가능: ^[0-9]+$ */
		DIGIT("^[0-9]+$"),
		/** 소문자 영어만 가능:[a-z] */
		LOWER("^[a-z]+$"),
		/** 우편번호(숫자 3자리수 - 숫자 2자리수): ^\\d{3}-\\d{4}$*/
		POSTALCODE("^\\d{3}-\\d{4}"),
		/** 특수 문자:!",$%&'()*+,-./:;<=>?@[]^_`{ */
		PUNCT("!\",$%&&'()*+,-./:;<=>?@[]^_`{]+$"),
		/** 공백 문자:[ \t\n\x0B\f\r] */
		SPACE(" \\t\\n\\x0B\\f\\r"),
		/** 대문자 영어만 가능:^[A-Z]+$ */
		UPPER("^[A-Z]+$"),
		/** 16진수 숫자만 가능:[0-9a-fA-F] */
		XDIGIT("^[0-9a-fA-F]+$");


		/** 정규식 */
		private final String regex;

		private PatternEnum(final String regex) {
			this.regex = regex;
		}

		/** 정규식을 저장하는 {@code Pattern}오브젝트를 반환*/
		@SuppressWarnings("unqualified-field-access")
		public Pattern toPattern() {
			return Pattern.compile(regex);
		}
	}

	/**
	* pattern 오브젝트에 지정한 정규식에 속해있는 경우 true, 속해있지 않는 경우는 false를 반환
	* @param pattern 정규식을 저장하는 오브젝트
	* @param input 정규식을 이용해 확인하고 싶은 대상 오브젝트
	* @return {@link Matcher,find()} 결과를 반환
	*/
	public static boolean findMatches(Pattern pattern, CharSequence input) {
		final Matcher m = pattern.matcher(input);
		return m.find();
	}

	/**
	* 메소드 안에서 {@code ExampleMatches,findMatches(Pattern, CharSequence)}를 호출。
	* @param patternEnum 정규식을 저장하는 오브젝트
	* @param input 정규식을 이용해 확인하고 싶은 대상 오브젝트
	* @return {@link ExampleMatches,findMatches(Pattern, CharSequence)}을 반환
	*/
	public static boolean findMatches(PatternEnum patternEnum, CharSequence input) {
		return findMatches(patternEnum.toPattern(), input);
	}
}

 

테스트 예제 코드 입니다.

ExampleMatchesTest.java

package com.openbooks.sample.marches;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

import java.util.regex.Pattern;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.openbooks.sample.marches.ExampleMatches.PatternEnum;

public class ExampleMatchesTest {

	@BeforeClass
	public static void setUpBeforeClass() {
	}

	@Before
	public void setUp() {
	}

	// PatternEnum.DIGIT 테스트 시작 부분

	// 정규식에서 숫자만 가능한 경우, 값이 숫자 이외의 경우 false 반환
	@SuppressWarnings("boxing")
	@Test(timeout=100)
	public void Test1() {
		final Pattern pattern = PatternEnum.DIGIT.toPattern(); // 숫자만
		final boolean result = ExampleMatches.findMatches(pattern, "0일2삼4오6칠8구");
		assertThat(result, is(Boolean.FALSE));
	}

	//정규식에서 숫자만 가능한 경우, 값이 숫자의 경우 true 반환
	@SuppressWarnings("boxing")
	@Test(timeout=100)
	public void Test2() {
		final Pattern pattern = PatternEnum.DIGIT.toPattern(); // 숫자만
		final boolean result = ExampleMatches.findMatches(pattern, "0123456789");
		assertThat(result, is(Boolean.TRUE));
	}

	//파라미터에 PatternEnum 를 지정한 패턴
	//정규식에서 숫자만 사용 가능한 경우, 값이 숫자의 경우 true 반환
	@SuppressWarnings("boxing")
	@Test(timeout=100)
	public void Test3() {
		final boolean result = ExampleMatches.findMatches(PatternEnum.DIGIT, "0123456789");
		assertThat(result, is(Boolean.TRUE));
	}

	//정규식에서 숫자만 사용 가능한 경우, 값이 숫자 이외의 경우 false 반환
	@SuppressWarnings("boxing")
	@Test(timeout=100)
	public void Test4() {
		final Pattern pattern = PatternEnum.DIGIT.toPattern(); // 숫자만
		final boolean result = ExampleMatches.findMatches(pattern, "일이삼사오육칠팔구");
		assertThat(result, is(Boolean.FALSE));
	}
}
// PatternEnum.DIGIT 테스트 끝

 

숫자 이외의 정규식 패턴의 테스트 소스는 생략하도록 하겠습니다.

영어나 공백문자 등을 테스트하려면 public enum으로 정의한 PatternEnum에서 테스트하고 싶은 패턴을 선택하면 됩니다.

숫자 예제에서는 PatternEnum.DIGIT를 사용했지만 대문자 영어에 대한 패턴 매칭을 하고 싶은 경우에는 PatternEnum.UPPER로, 우편번호 패턴 매칭을 테스트하고 싶은 경우에는 PatternEnum.POSTALCODE로 변경하여 사용면 됩니다.

댓글