JAVA

정규식(Regular Expression)

k9e4h 2017. 4. 18. 14:56

2022.09.20 업데이트

 

다양한 입력케이스를 정규표현식을 통해 코드를 간결하게 처리할 수 있다.

약간의 차이가 있지만 다양한 언어와 프로그램에서 지원하는 범용성이 뛰어난 문법

크롤링할때 많이 사용됨

 

정규식 패턴도 성능 개선을 할 수 있다. *참고 : https://lktgt.tistory.com/33

java의 Pattern 객체는 static, final 등과 같이 써서 재컴파일을 하지 않도록 하는 것이 성능 개선에 도움이됨

 

 

정규식 TEST 싸이트

https://regex101.com/

http://regexr.com/

 


정규식 종류

- 한 문자를 표현하는 정규식

- 한 문자의 반복 횟수를 지정하는 정규식

- 문자열의 시작과 끝을 지정하는 정규식

- 단어를 표현하기 위한 그룹 지정 정규식

- 순환 반복을 지정하기 위한 그룹 지정 정규식

- 이스케이프 문자 표현 정규식


 

1)  기본 문자 규칙 (Characters)

- java에서 \는 escape 문자이므로 \\로 작성해도 \로 나타난다.

 

\\ The backslash character
\0n The character with octal value 0n (0 <= n <= 7)
\0nn The character with octal value 0nn (0 <= n <= 7)
\0mnn The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7)
\xhh The character with hexadecimal value 0xhh
\uhhhh The character with hexadecimal value 0xhhhh
\x{h...h} The character with hexadecimal value 0xh...h (Character.MIN_CODE_POINT  <= 0xh...h <=  Character.MAX_CODE_POINT)
\t The tab character ('\u0009')
\n The newline (line feed) character ('\u000A')
\r The carriage-return character ('\u000D')
\f The form-feed character ('\u000C')
\a The alert (bell) character ('\u0007')
\e The escape character ('\u001B')
\cx The control character corresponding to x

ex> 

String regex="\\";

 

2) 문자 집합 규칙 (Character class)

- 대괄호를 사용한다

[abc] a, b, or c (simple class)
[^abc] Any character except a, b, or c (negation)
[a-zA-Z] a through z or A through Z, inclusive (range)
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]] d, e, or f (intersection)
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)

ex))

String regex="[abc]";            // a|b|c 문자 중에서 한개 

String regex="[a-z]"             // a~z까지 중에서 문자 1개 : 소문자 하나 

String regex="[a-zA-z_]";       // 대소문자 or 언더라인(_) 1개, 여러개 이을때 csv가 없는듯

String regex="[^a-z]";          // a-z 빼고 모두

String regex="[a-dx-z]";        // a~d, x~z 허용

 

3)  미리 정의된 규칙 (Predefined character classes, not user definition)

. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\h A horizontal whitespace character: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H A non-horizontal whitespace character: [^\h]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\v A vertical whitespace character: [\n\x0B\f\r\x85\u2028\u2029]
\V A non-vertical whitespace character: [^\v]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]

ex))

String regex=".";            // 어떤 한개의 문자

String regex="\\d";      // 0-9까지의 숫자 , \d 이지만 java에서 \는 escape 문자이므로 하나더 써줘야해!

String regex="\\w";      // [0-9a-zA-z_] 비밀번호 할때 많이하는 확인ㅋㅋㅋ

 

 

4) 문자의 개수 지정하기 (greedy quantifiers)

X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times

 

 

ex>

String regex="a";             // a 한개

String regex="a?";           // ? : 0 or 1 // + : 1이상// * : 0이상

String regex="a{3}"         // 3개

String regex="a{3,}";        // 3이상, 뒤에 숫자는 제한갯수

 

 

5) 문자의 순서

 

String regex="ab";         // a다음에 반드시 b가 와야해

String regex="ab?";        // a다음에 b가 오거나 말거나

String regex="(ab)?";      // ab가 있거나 없거나

String regex="a|b";         // a,b 둘중하나가 반드시 있어야한다

String regex="(a|b)+";     // a또는 b가 한개 이상

String regex="\.";         // .:어떤문자 // . 자체를 표현하기 위해서는 역슬래시를 써야한다 ?? 에러남

 

 

 

6) 예제

 

// 전화번호 검증해보기

String regex="(\\d{2,4}-)?\\d{3,4}-\\d{4}"; // 지역번호는 있을때도 있고 없을때도 있으니까

 

//이메일 검증해보기

String regex="\\w+@\\w+\\.[a-zA-A]{2,10}";

 

//암호 검증해보기

String regex="(?=.+[0-9])(?=.*[a-zA-z])(?>.*[!@?]).*{4,8}"; 

 

 

 


참고 사이트

 

정규식 Step By Step

http://zvon.org/comp/r/tut-Regexp.html

 

자주 쓰이는 정규식

http://gocoding.tistory.com/93

 

Meta 정보 정리

http://www.devholic.net/1000238

 

 

 

반응형

'JAVA' 카테고리의 다른 글

[JAVA] List, ArrayList  (0) 2017.09.22
JsonRequester  (0) 2017.07.05
JAVA equals 와 ==의 차이점  (0) 2017.03.17
왜 JAVA에서 Enhanced For Loop를 사용하지 않을까?  (0) 2017.02.02
JAVA SWING 링크 정리  (0) 2016.12.06