[Java] 정규식 표현 (Regular Expression)
정규식 의미
- 복잡한 문자열 패턴을 정의하는 문자표현 공식
- 정규표현식, regexp 또는 regex등으로 불림
- 특정한 규칙을 가진 문자열의 집합을 추출
정규식 사용 이유
* 텍스트 검색과 치환의 효과성
-조건절 처리없이 문자열 조작 가능
-모든 종류의 텍스트 강력한 처리 조작(검색, 치환)
-데이터 parsing시 빠른 코딩
*대부분의 컴퓨터 언어 지원 (확장성)
## 배경
Web Project를 진행하면 Client에게서 어떠한 정보가 입력될지 모르기에, 이 정보를 정규화하는 과정이 필요합니다. 이를 유효성 검사라고 하는데 유효성검사를 제대로 하지않으면, 데이터의 신뢰도가 떨어지게 되고, 예기치 않은 에러를 발생시키기 때문입니다. 이를 위해서는 각 언어마다 정규표현식을 제공해주고 있으며, 크게 다르지 않습니다.
정규식 사용 예
- 택스트 처리 작업
- 데이터 검증 ( 주민번호, 휴대폰 번호 등)
정규식 메서드 (자바 문자열 객체(java.lang.String))
- boolean matches(String regex) 인자로 주어진 정규식에 매칭되는 값이 있는지 확인합니다.
- String replaceAll(String regex, String replacement) 문자열내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement문자열로 바꾼 문자열을 반환합니다.
- String[] split(String regex) 인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할합니다. |
정규식 객체 ( java.util.regex 패키지 )
- Pattern 객체 정규식의 컴파일된 표현 입니다(정규식을 적용 가능하도록 컴파일해서 가지고 있습니다). Pattern 클래스는 공개된 생성자를 제공하지 않습니다. 패턴을 생성하려면 Pattern객체를 반환하는 정적 compile 메소드를 호출해야 합니다. 이 메소드는 첫 번째 인자로 정규식 문자열을 받아 들입니다.
- Matcher 객체 패턴을 해석하고 입력 문자열에 대해 일치 작업을 수행하는 엔진입니다. Pattern 클래스와 마찬가지로 Matcher는 어떤 공개된 생성자도 정의하고 있지 않습니다. Matcher객체는 Pattern 객체의 matcher 메소드를 호출해서 얻습니다.
- PatternSyntaxException 객체 정규식 패턴의 문법 오류를 나타내는 unchecked 예외 입니다. |
문법
^ | 문자열 시작 |
$ | 문자열 종료 |
. | 임의의 문자 [단 ‘'는 넣을 수 없습니다.] |
* | 앞 문자가 0개 이상의 개수가 존재할 수 있습니다. |
+ | 앞 문자가 1개 이상의 개수가 존재할 수 있습니다. |
? | 앞 문자가 없거나 하나 있을 수 있습니다. |
[] | 문자의 집합이나 범위를 표현합니다. -기호를 통해 범위를 나타낼 수 있습니다. ^가 존재하면 not을 나타냅니다. |
{} | 횟수 또는 범위를 나타냅니다. |
() | 괄호안의 문자를 하나의 문자로 인식합니다. |
| | 패턴을 OR 연산을 수행할 때 사용합니다. |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 문자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | [0-9] 숫자 |
\D | 숫자를 제외한 모든 문자 |
(?i) | 대소문자를 구분하지 않습니다. |
정규식에 사용되는 메타문자의 사용법
기본패턴틀
1. 자주 쓰이는 패턴
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})
2. 분석
- ^ : 문자열 시작을 알립니다.
- [ ] : 안에 정해진 문자형식범위를 나타냅니다. 대괄호 안에 ^있으면 not을 나타냅니다.
ex) ^[^a-zA-z]*$ 를 입력하면 영어는 아닌 문자를 의미합니다. - ( ) : 하나의 문자로 취급합니다.
ex) (abc) 패턴일 경우 : abc외에는 모두 false처리 됩니다. (abc)* 의 경우 abc의 반복을 제외하고 모두 false처리됩니다. - { } : 횟수 또는 길이를 나타내어줍니다.
- * : 이전 문자의 갯수의 제한을 두지 않습니다. *를 입력하지 않으면 개수를 1개로 인정하고 조건이 맞아도 문자 길이가 1를 넘어가면 false를 반환합니다.
- + : 앞에 있는 정규식 형식이 1개가 꼭 들어가야 한다는 의미입니다..
- \\d : \를 2개 붙이는 이유는 "\\d" 문자 안에서 \ 다음 \문자가 특수문자라고 알려주는 것과 같습니다. 이 형식을 사용하면 숫자만 true를 반환합니다.
ex) ^[a-zA-Z]+\\d{2} 는 어떠한 값이 true를 반환할까?
=> ^시작열을 알리기에 앞에 a~Z까지 +로 인해 문자가 꼭 1개 들어가야 합니다.. 그리고 숫자 2개를 포함한다라고 해석 할 수 있습니다.
-------------- 사용 예 --------------
TB_ 로 시작하는 테이블명만 추출
(?=TB_.)+[A-z]\w* 설명
(?=TB_.) = 후방검색 , TB_ 이후 모든 글자 검색
[A-z]\w* = [A-z] , A부터 z까지 검색 (대소문자 포함검색)
\w , 알파벳이나 문자 (특수문자 [ 괄호 등 ] 제외 )
* or + , *-> 0개이상, + -> 1개이상 매칭
-------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- --------------
-------------- 상세 예 --------------
1. 매칭될 문자를 지정하거나, 제외하는 방법입니다.
정규식설명
[abc] | a, b, c중 하나이면 일치 합니다. |
[^abc] | a, b, c를 제외한 다른 글자 이면 일치합니다. |
[a-zA-Z] | a 부터 z까지의 소문자 알파벳 이거나 A 부터 Z까지의 대문자 알파벳 중의 하나라면 일치합니다.(범위) |
[a-d[m-p]] | a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다: [a-dm-p] (합집합) |
[a-z&&[def]] | d, e, f 중의 하나와 일치합니다. (교집합) |
[a-z&&[^bc]] | b와 c를 제외한 a 부터 z까지 중의 하나와 일치합니다: [ad-z] (차집합) |
[a-z&&[^m-p]] | m부터 p 까지를 제외한, a 부터 z까지 중의 하나와 일치합니다: [a-lq-z] (차집합) |
2. 미리 정의된 문자를 지정하는 방법입니다.
정규식설명
. | 임의의 문자 (라인 종결자와 일치할 수도 하지 않을 수도 있음) |
\d | 숫자 문자: [0-9] |
\D | 숫자 문자가 아닌것: [^0-9] |
\s | 화이트 스페이스 문자: [ \t\n\x0B\f\r] |
\S | 화이트 스페이스 문자가 아닌것: [^\s] |
\w | 알파벳 단어 문자(word 문자): [a-zA-Z_0-9] |
\W | 알파벳 단어 문자가 아닌것: [^\w] |
3. 수량 매칭
패턴이 나오는 횟수를 지정할 수 있습니다.
GreedyReluctantPossessive의미
X? | X?? | X?+ | X가 없거나 한번 나옴 |
X* | X*? | X*+ | X가 없거나 한번 이상 나옴 |
X+ | X+? | X++ | X가 한번 또는 여러번 나옴 |
X{n} | X{n}? | X{n}+ |
X가 정확히 n번 나옴 |
X{n,} | X{n,}? | X{n,}+ | X가 n번 이상 나옴 |
X{n,m} | X{n,m}? | X{n,m}+ | X가 n이상 m이하로 나옴 |
-------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- --------------
============참조
정규표현식 _기본틀 |
|
메서드 , 객체 |
https://offbyone.tistory.com/400 [쉬고 싶은 개발자] |
https://postitforhooney.tistory.com/entry/JavaRegex-자바-정규표현식에-대해서-공부하고-예제-만들기 [PostIT] |
|
다음에 연습해볼 예제
Matcher, Pattern, find(), group() |
|
https://offbyone.tistory.com/400 | 전체 설명 ( 완독 필수 ) |