정규표현식(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/