Programming/JAVA

[JAVA] 정규표현식

Plone 2020. 10. 1. 21:29

#정규표현식이란

문자열에 정해진 문자열만 포함되어 있는가 검사해서 True, False로 결과를 반환하는 것

 

 

#정규표현식 작성 방법

문자 인코딩에 따라 조금씩 다르다

 ^

 문자열의 시작

 문자열의 종료

 .

 임의의 한 문자 (문자의 종류 가리지 않음)

 단, \ 는 넣을 수 없음

 *

 앞 문자가 없을 수도 무한정 많을 수도 있음

 앞 문자가 하나 이상

 앞 문자가 없거나 하나있음

 []

 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.

 {}

 횟수 또는 범위를 나타낸다.

 ()

 소괄호 안의 문자를 하나의 문자로 인식 

 |

 패턴 안에서 or 연산을 수행할 때 사용

 \s

 공백 문자

 \S

 공백 문자가 아닌 나머지 문자

 \w

 알파벳이나 숫자

\W 

 알파벳이나 숫자를 제외한 문자

\d 

 숫자 [0-9]와 동일

\D 

 숫자를 제외한 모든 문자

 정규표현식 역슬래시(\)는 확장 문자
 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미

(?i) 

 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음

 

#정규표현식 예제

1) 숫자만 : ^[0-9]+$

2) 영문자만 : ^[a-zA-Z]+$

3) 한글만 : ^[가-힣]+$

4) 영어 & 숫자만 : ^[a-zA-Z0-9]+$

5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$

6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

7) 일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$

8) 주민등록번호 : \d{6} \- [1-4]\d{6}

9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

10) URL : "^(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$"

 

#일본 기준

1) 숫자만 : ^[0-9]+$

2) 영문자만 : ^[a-zA-Z]+$

3) 히라가나 : ^[\\u3040-\\u309F]+$  or  ^[ぁ-ん]+$

4) 가타카나 : ^[\\u30A0-\\u30FF]+$  or  ^[ァ-ヶ]+$

5) 반각 가타카나 : ^[\\uFF65-\\uFF9F]+$

6) 전각문자만 : ^[\\u3040-\\u30FF]+$

7) 한자 : ^[亜-熙]+$

 

 


#정규표현식 사용 예제

검사 방법은 3가지 방법이 있다

package Study;

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

public class PatternStudy {
	public static void main(String[] args) {
		String reg = "^[0-9]*$";//정규표현식
		String strValue = "ABC";//검사할 문자열
		
		// 결과를 true, false로 반환함
		System.out.println(Pattern.matches(reg, strValue));//Pattern클래스의 matches 메서드, 대상 문자열이 패턴과 일치하는지 검사
		System.out.println(reg.matches(strValue));//String클래스의 matches 메서드, 대상 문자열이 패턴과 일치하는지 검사
		
		// 결과를 true, false로 반환함
		Pattern pattern = Pattern.compile("^[0-9]*$");//주어진 정규표현식으로 패턴을 작성함
		Matcher matcher = pattern.matcher(strValue);//대상 문자열이 패턴과 일치하는지 검사
		System.out.println(matcher.find());
		
		//일본어
		String reg2 = "^[\\u3040-\\u309F]+$";
		String str = "あい";
		System.out.println(str.matches(reg2));
	}
}

 

 

#정규표현식을 조합해서 쓰는 방법도 존재한다

 

package Study;

public class PatternStudy2 {
	
	static final String ENGLISH_CODES = "a-zA-Z"; //영문자
	static final String KOREA_CODES = "가-힣"; //한글
	static final String NUMBER_CODES = "0-9"; //숫자
	static final String HIRAGANA_CODES = "\\u3040-\\u309F"; //히라가나
	static final String KATAKANA_CODES = "\\u30A0-\\u30FF"; //가타카나
	
	//지정한 문자만 허용하는 정규표현을 반환함
	public static String toMatchRegex(String codes) {
		return "^[" + codes + "]+$";
	}
	
	//지정 문자 이외만 허용하는 정규표현을 반환함
	public static String toNotMatchRegex(String codes) {
		return ".*[^" + codes + "].*";
	}
	
	public static void main(String[] args) {
		String str1 = "안녕하세요123";
		String str2 = "あいうえABC123";
		
		//지정한 문자만 허용하는 정규표현을 반환함
		System.out.println(str1.matches(toMatchRegex(KOREA_CODES + NUMBER_CODES)));
		System.out.println(str2.matches(toMatchRegex(HIRAGANA_CODES + ENGLISH_CODES + NUMBER_CODES)));
		
		//지정 문자 이외만 허용하는 정규표현을 반환함
		System.out.println(str1.matches(toNotMatchRegex(KOREA_CODES + NUMBER_CODES)));
		System.out.println(str2.matches(toNotMatchRegex(HIRAGANA_CODES + ENGLISH_CODES + NUMBER_CODES)));
	}

}