티스토리 뷰


이번 포스팅에서는

여러 언어에서 사용하는

정규표현식에 대해서 

알아보도록 하겠습니다.


=======================================================


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 = "419135,97 4539,1132".split(",");
for(int i=0;i<s.length;i++) {
System.out.println(s[i] + " matches " + s[i].matches("\\d{2}\\s?[-]\\d{3,}"));
// 419135 (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
링크
«   2024/04   »
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
글 보관함