정규 표현식 (Regex)
특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다.
주로 DB 관련 개발의 데이터 검증, 파싱 등에 많이 쓰이는 것으로 보입니다.
자주 사용되는 정규 표현식
| 메타문자 | 기능 | 매치 예시 |
| . | 임의의 한 문자 (\ 제외) | "ab.d" : abcd, abdd, ab!d ... |
| * | 0번 이상 발생 | "ab*c" : ac, abc, abbc … |
| + | 1번 이상 발생 | "ab+c" : abc, abbc ,,, : *과의 차이 : ac는 포함x |
| ? | 0 또는 1번 발생 | "Colou?r" 은 u가 0 또는 1번 : color, colour |
| {n} | n번 일치 | "a{2}bc" : aabc |
| {n,} | n번 이상 일치 | "a{2,}bc" : aabc, aaabc … |
| {n,m} | n번 이상 m번 이하 일치 | "a{2,4}bc" : aabc, aaabc, aaaabc |
| | | 또는 | “abc|def” : abc, def |
| [ ] | 중 하나 | “[abc,def]” : abc, def (|쓰는 것과 같음) |
| [^ ] | 제외한 나머지 | "[^ab]c : ac (x), bc (x) / cc, dc ... (o) |
| ( ) | 괄호 안 문자를 하나의 문자로 인식 | "ab(.+)xy" : abcxy, abcdxy, ab@!xy, abcd@!xy ... |
| \b | 단어의 경계 ( 단어 : 영문자 / 숫자 ) | "\\ba.\\b" : ab a0 cd, ab@a0#cd => a0 |
| \B | 단어가 아닌 문자의 경계 | "\\Ba.\\B" : ba01 => a0 |
| \s | 공백 ( 스페이스, 탭 등 ) | "\\scd" : ab cd => cd |
| \S | 공백 문자가 아닌 문자 | "\\Scd" : abcd => abcd |
| \w | 영문자 / 숫자 | "\\w" : a@bc!d => a, bc, d ( a 다음 매치 bc 다음 매치 d ) |
| \W | 영문자 / 숫자 외 문자 | "\\W" : a@bc .d! => @, ., ! |
| \d | 숫자 | "\\d" : ab12c => 12 |
| \D | 숫자 외 문자 | "\\D" : ab12! => ab, ! |
| (?!) | 대소문자 구분x | "(?!)abc" : abc, Abc |
💡 정규 표현식에서 특수 문자를 쓰는 경우
백슬러시(\)는 뒤에 오는 문자가 특수 문자인 경우 일반 문자로,
일반 문자인 경우 특수 문자로 취급하는 확장 문자입니다.
때문에 \n 과 같은 경우 문자 n이 \로 인해 줄바꿈 기능을 가진 특수 문자로 읽히게 됩니다.
( \t, \r, \n 등 허용된 문법만 가능합니다. )
반면 \를 문자로 취급하기 위해선 \\로 사용해야 합니다. ( \는 단독으로 사용될 수 없습니다. )
ex) String s = "\\"; (o)
String s = "\n"; (o)
여기서 구분해야 할 점은
정규 표현식에서의 메타 문자 \b, \w 등은 위 문법과는 다른 정규 표현식만의 문법입니다.
( 이해를 돕기 위해, String s = "\b"; 는 존재하지 않는 표현입니다. )
따라서 메타 문자 \w의 \를 자바의 문자열로 표현하려면 "\\w"로 입력해야 합니다.
ex ) s.split("\\w"); s.replaceAll("\\w", "");
이러한 방식으로 특수 문자를 '문자'로 사용하는 경우에도 표현이 달라집니다.
메타 문자인 +, ., ^, *, |, ?, $, (, {, [ 는 \\ 를 붙여 사용합니다.
\는 \\로 표현하기 위해 "\\\\"로 사용해야 합니다.
"는 예외로 \"로 사용됩니다.
Pattern 클래스
정규 표현식으로 문자열을 검증하는데에 사용하는 클래스입니다.
Pattern pattern = Pattern.compile(String regex);
| 메서드 | 기능 |
| matches( String regex, CharSequence input ) | 문자열 input이 정규식 regex와 일치하면 true, 아니면 false 반환 |
| compile( String regex ) | 정규식 regex로 패턴을 생성 |
| 패턴.pattern() | compile()한 패턴을 String으로 반환 |
| 패턴.matcher( CharSequence input ) | 문자열 input이 패턴과 일치하면 true, 아니면 false 반환 |
| 패턴.split( CharSequence input ) | 문자열 input을 패턴 기준으로 분리 |
* CharSequence : 인터페이스로, 대표 클래스는 String, SpannableStringBuilder 등이 있으며, 문자열 외에도 다양한 데이터를 입력 받을 수 있는 장점이 있습니다.
Matcher 클래스
입력받는 문자열의 패턴을 해석하여 주어진 패턴과 일치하는지 확인하는데에 사용하는 클래스입니다.
Matcher matcher = pattern.matcher(CharSequence input);
| 메서드 | 기능 |
| matches() | 문자열 input이 패턴과 일치하면 true, 아니면 false 반환 |
| find() | 문자열 input이 패턴과 일치하면 true를 반환하고 그 위치로 이동 |
| group() | 일치한 문자열 반환 |
| start() | 일치한 문자열의 시작 위치 반환 |
| end() | 일치한 문자열의 끝 위치 반환 |