티스토리 뷰
이번 포스팅에서는
여러 언어에서 사용하는
정규표현식에 대해서
알아보도록 하겠습니다.
=======================================================
Regular Expression
1. Regular Expression : What?
Regular Expression은 정규표현식이라고 합니다. 이는 일정한 패턴의 조건에 일치하는 문자열을 찾아내기 위한 기능입니다.
예를 들어 사용자가 전화번호를 입력했을 때 전화번호의 패턴을 이용해 사용자가 전화번호를 입력한 것인지 판단하도록 설계합니다.
사용자가 전화번호을 입력했을 때 3자리 숫자 + '-' + 4자리 숫자 + '-' + 4자리 숫자의 패턴 ('-' 하이픈도 포함해야합니다.)로 정규표현식을 만들었다면 컴퓨터는 각 패턴에 맞는 문자열인지 구분할 수 있습니다.
원래 Unix에서 사용하던 것이고 Perl의 강력한 기능이었는데 요즘은 java와 같은 다양한 언어에서도 지원하고 있습니다.
Java API 문서에서 java.util.regex.Pattern을 찾아보면 정규표현식에서 사용하는 기호와 작성방법이 설명되어있으니 참고하시면 됩니다.
## 제가 정규표현식을 공부할 때 느낀 것은 자바의 일부분을 배우는 것이 아닌 새로운 언어를 배우는 느낌이었습니다. 그만큼 표현식을 어떻게 작성하고 이해하기 쉽지 않습니다. 내용도 매우 많아서 전부 소개한다 하면 책 한 권이 나올 정도라니 자주 쓰이는 것 정도만 알아두어도 괜찮습니다.
2. Regular Expression : When, Why?
정규표현식은 대량의 데이터나 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 때 주로 사용됩니다.
예를 들어 어떤 글에서 이메일과 전화번호만 뽑아낸다던가 입력한 비밀번호가 영문+숫자 조합인지 체크하는 기능으로 사용됩니다.
사용하는 목적은 뚜렷하나 사용하는 방법이 워낙 까다롭다 보니깐 자주 사용해보고 응용해보아야 할 것입니다.
3. Regular Expression : How?
## java.util.regex 패키지에 존재하는 Matcher 클래스와 Pattern 클래스로 사용할 수 있습니다.
1. 정규식을 파라미터로 Pattern 클래스의 static 메소드인 compile()을 호출하여 Pattern 인스턴스를 얻을 수 있습니다.
- Pattern compile(String regex) {}
- Pattern은 정규식을 정의하여 사용하고자 하는 Pattern을 정하는 클래스입니다.
2. 정규식으로 비교할 대상을 파라미터로 앞에서 만든 Pattern 클래스의 matcher() 메소드를 호출해서 Matcher 인스턴스를 얻습니다.
- Matcher matcher(CharSequence input) {}
- Matcher는 정규식(패턴)을 데이터와 비교하는 역할을 합니다.
3. Matcher 인스턴스에 matches()를 호출해서 정규식에 부합하는지 확인합니다.
- boolean matches() {}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Source01_Regex {
public static void main(String[] args) {
String[] sample = {"홍길동","trumt","trump","arump","prump","te0506","A홍길동A"};
Pattern p = Pattern.compile("[a-t]rum[pt]");
for(int i=0; i<sample.length; i++) {
Matcher m = p.matcher(sample[i]);
if(m.matches())
System.out.println(sample[i]); // trumt, trump, arump, prump
}
}
}
Pattern을 생성하고 Matcher를 통해 데이터와 비교하면 위와 같이 패턴에 맞는 문자열을 찾을 수 있습니다.
## String의 메소드에서 matches()에서도 사용할 수 있습니다.
String에 있는 matches()는 정규표현식과 비교하여 같은지 틀렸는지 알 수 있습니다.
public class Source02_Regex {
public static void main(String[] args) {
String[] sample = "홍길동,trumt,trump,arump,prump,te0506,A홍길동A".split(",");
for(int i=0;i<sample.length;i++) {
String s = sample[i];
System.out.print("[" + i + "]" + s + " : ");
// System.out.println(s.matches("trump")); // 문자열 글자를 입력하면 equals와 같은 기능 / trump
// System.out.println(s.matches("[at]rump")); // [] 안에 문자중 하나라도 포함하면 true / arump, trump
// System.out.println(s.matches("[at]rum[pt]")); // arump, trump, trumt
// System.out.println(s.matches("[a-t]rum[pt]")); // arump, trump, prump, trumt
// System.out.println(s.matches("[^a-p]rum[pt]")); // trumt, trump (a-p)문자를 제외한 패턴 검색
// System.out.println(s.matches(".rum[pt]")); // trumt, trump, arump, prump rum 앞에는 아무 글자나 상관없다.
}
}
}
String[]에 담긴 배열을 순서대로 패턴과 일치하는지 체크하는 코드입니다.
String 클래스에서도 matches메소드가 존재하기 때문에 정규표현식으로 비교할 수 있습니다.
4. Regular Expression : Pattern?
앞에서 말한 것과 같이 정규표현식은 굉장히 많은 내용을 가지고 있습니다. 그 때문에 많이 사용하는 표현만 알아보도록 하겠습니다.
## 정규식
- 문자 값들의 패턴을 분석하는 데 사용합니다.
- [] : 한 문자를 나타내고자 할 때 사용합니다. 이 안에 문자구성이 연결되어있는 문자값이라면 '-' 처리로 가능 ( [A-Za-z]라 하면 a부터 z까지, A-Z까지의 문자 값을 체크 )
- ^ : 제외하고자 할 때 사용합니다.
- . : 어떤 문자든지 상관없을 때 사용합니다. (공백도 문자 취급)
- \\d : 수치형 문자 (0~9까지의 한 숫자를 비교), [0-9]와 같은 효과
- \\D : 수치형 문자 제외, [^0-9]와 같은 효과
- \\w : char형 문자, 한글을 제외한 char형 문자인지 확인, _ 도 포함 [A-Za-z_0-9]와 같은 효과
- \\W : \\w 범위 제외확인
- \\s : 공백형 문자, 공백확인
- \\S : 공백형 문자 제외확인
## 제한문자
- 제한문자 사용법 : [특정그룹]<제한문자>
- ? : 있거나 없거나
- + : 한 개 이상 있어야 함
- * : 없어도 되고 여러 개가 있어도 됨
- {n} : 정확하게 몇 개가 있어야 한다.
- {n, } : 최소한 몇 개가 있어야 함
- {n, m} : 최소 ~ 최대 개수
public class Source03_Regex {
public static void main(String[] args) {
// 정규식 사용
System.out.println("13".matches("\\d\\d")); // true (\\d가 숫자 하나를 의미하여 십자리 숫자 판단)
System.out.println("loc_p5".matches("loc_[a-z]\\d")); // true
System.out.println("loc_p5".matches("loc_[a-z][0-9]"));// true [0-9]와 같은 효과
System.out.println("loc_pa".matches("loc_[a-z]\\d")); // false
System.out.println("loc_pa".matches("loc_[a-z]\\D")); // true
// 제한문자 사용
String[] s = "41오9135,97 나4539,11허32".split(",");
for(int i=0;i<s.length;i++) {
System.out.println(s[i] + " matches " + s[i].matches("\\d{2}\\s?[가-힇]\\d{3,}"));
// 41오9135 (97 나4539의 공백은 2개이기 때문에 ?로는 false, *로하면 true)
}
}
}
'Java > Class' 카테고리의 다른 글
6. Collections Framework (0) | 2018.10.23 |
---|---|
5. Wrapper Class (0) | 2018.10.22 |
3. StringBuffer & StringBuilder (0) | 2018.10.18 |
2. String Class (0) | 2018.10.17 |
1. Object Class (0) | 2018.10.16 |
- Total
- Today
- Yesterday
- login
- SDK
- Queue
- 로그인
- @subselect
- on('seek')
- Animation
- oauth
- SET
- @subquery
- 네트워크
- IN Clause
- playbackRate
- QueryDSL
- playsinline
- beforeunload
- jwplayer
- 의미
- 예제
- 장점
- 자바
- list
- 특징
- Multi IN Clause
- @EventListener
- API
- map
- 관리자 도구
- 원리
- join subquery
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |