정규표현식(Regular Expression)


목차

  • 개요
  • 정규표현식 기본
  • 복잡한 문자열 찾기
  • 문자열 치환하기
  • 전방탐색 후방탐색

4월 1일


개요

가끔 서점이나 도서관에서 볼 수 있는 두꺼운 정규표현식에서 나오는 정규표현식 엔진이 어떻게 돌아가거나 너무 자세한 그런 내용 보다는 필요한 내용위주로 공부했습니다.

정규표현식은 보기에는 굉장히 복잡해 보이지만 3일 연습하면서 써본 결과 블로그 보는건 소용없고 한번 해보면서 이하하는게 더 쉬운 언어입니다.

정규표현식을 하면서 왜 진작에 크롤을 할 때 마다 정규표현식을 안 썼는지 후회했습니다 ㅠㅠ

이 글에서는 자바를 기준으로 정규식을 사용합니다.


정규표현식 기본

이 챕터는 정규표현식의 튜토리얼 입니다. 간단하게 문법 몇 개와 그 사용법을 정리한 부분입니다.

다음 코드는 자바에서 정규표현식을 사용하여 매치되는 모든 문자열을 출력하는 예시

     Pattern groupPattern = Pattern.compile(re); //re는 정규식 와 같은 패턴                                       
     Matcher groupMatcher = groupPattern.matcher(tests);// tests는 문자열                                    
     int t=0;                                                                                            
     while(groupMatcher.find()){                                                                         
     System.out.println(groupMatcher.group()+"     ///"+t++);                                            
     }         

자바에서는 정규식을 사용하기 위해 Pattern과 Matcher라는 클래스를 지원합니다.

이제는 정규식의 문법을 봅시다. 제일 처음은 .입니다.

String regex="ABCD"

이런 경우에는 결과로 문자열의 ABCD 모두다 찾습니다.

String regex="."   

. 는 아무 문자 하나를 의미합니다.

String regex="|"      

|는 if문의 |와 비슷하게 왼쪽 혹은 오른쪽에 일치합니다.
만약 (abb|adb)1 가 있다면 abb를 먼저 검사해서 abb를 포함하고 있다면 abb1이 결과이고 adb라는 문자열을 포함할때는
abb도 가지고 있으면 adb를 찾는게 아니라 abb를 찾을 수 도 있습니다. 그런 경우는 대게 String s=”abbadb ..”같은 경우입니다.

String regex="[]"    

[][]안에 문자중 하나와 일치합니다. []를 이용해서 숫자나 한글 영어만 쓰는 문자를 찾을수도 있습니다.

[0-9]//숫자                                                                                                
[가-힣]//한글                                                                                                
[a-z]//영어 소문자                                                                                            
[A-Z]//영어 대문자                                                                                            
[1-6]//1에서 6까지만      

이런 식으로
그리고 []안에 ^를 넣으면 []안에 들어가있는 구성원을 제외하고 일치합니다.

String regex="*"  

*는 하나 이상의 문자가 없거나 하나 이상의 문자가 반복될때 사용합니다. 그냥 *혼자 쓰면 안되고 앞에 대상이 되는 문자를 써야 됩니다.

[0-9]*                                                                                                   

+는 반드시 하나 이상의 문자가 반복될 때 입니다.

[0-9]+                                                                                                   

?는 앞에 있는 문자가 있을수도 있고 없을 수 도 있을 때 쓰는 문자입니다. 참고로 공백에도 사용할 수 있습니다.

String regex="abc ?d"                                                                                    
결과 abc d                                                                                                 

정규식에서 중괄호를 보자

A{3}                                                                                                     
결과는 AAA                 

보통은 이렇게 많이 쓰고 그 외에 문법으로
{n,}같은 경우에는 n번 이상 일치한 경우이고 {n,m}같은 문법도 있습니다.

^str                                                                                                     
str$                                                                                                     
결과: str ....                                                                                             
        ..... str              

^는 문자열 맨 앞과 잎치 $는 맨뒤와 일치합니다.
<는 단어 시작과 일치 >단어 끝과 일치합니다.

정규 표현식에서 특수문자를 사용할려면 \를 앞에 붙이면 됩니다.


이제 복잡한 문자열을 찾아보자 복잡한 문자열을 찾기위해서는 ()를 이용해 하위표현식을 만듦니다.

인텔|코어i5-7세대|카비레이크|i5-7200U (2.5GHz)|39.62cm(15.6인치)|1920x1080|LED백라이트|광시야각|슬림형 베젤|8GB|DDR4|M.2|256GB|HD 6

다음과 같은 문자열이 있을 때의 컴퓨터 정보를 뽑아내는 정규식 몇 개를 보여줄려고 합니다.

//무계 표현식:([0-9]\.[0-9]+ ?Kg)|([0-9]{3} ?g)                                                               
//화면 인치: [0-9]{2}\.[0-9]{2}cm.{8}                                                                        
//해상도: [0-9]{4}x[0-9]{4}                                                                                 
//코어 스펙: i[0-9]\-[0-9]{4}((U)|(HQ)|(QM)|(H)|(M)) ?\(([0-9]\.[0-9]GHz)\)                                  
//코어 세대: \|[가-힣]+((레이크)|(.*웰))                                                                           

설명은 코어 스펙만 설명하려고 합니다. 코어 스펙은 i로 시작하고 [0-9] 까지의 넘버링을 가지고 있고
-로 이어저서 [0-9]{4} 숫자 4개가 이어져있습니다. 그 후 코어 종류에 따라붙는 영어가 바뀌기에 여러 문자를 ()로 묶고 |로 나누었습니다
그 뒤에 공백이 있을수 있으니 ? (2.5GHz)를 찾는 표현식을 사용하였습니다.

한가지 팁을 쓰자면 뒤에 일부분 씩 차는 정규식을 만들고 다 합쳐보면 어찌저찌 만들어짐니다.
정규식이 어떻게 되는지 미리 보고 싶으면 다음 사이트를 이용하는 것도 좋은 방법입니다.
http://www.regexper.com/