RegExp

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

RegExp (정규표현식)을 정리 합니다.

RegExp 개요

  • 정규표현식(Regular Expression, RegExp)
  • 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
  • 정규표현식 스타일
  • POSIX (Portable Operating System Interface) : Unix 기반 정규표현식
  • PCRE (Perl Compatible Regular Expression) : Perl 호환 정규표현식

RegExp Process.png

  • 정규표현식 테스트용 웹사이트
  • 정규표현식 Cheatsheets

RegExp Cheatsheets.png

정규표현식 사용

JavaScript

  • RegExp 변수 생성
  • i flag : Ignore case, 대소문자 구별을 하지 않음
  • g flag : Global, 문자열 내의 모든 패턴을 검색
  • m flag : Multi line, 줄이 바뀌어도 검색
  • 역참조 : $1, $2, $3, … 사용
var regExp = null;

regExp = new RegExp('정규표현식', flag);	//--- RegExp 객체로 생성
regExp = /정규표현식/flag;			//--- 객체 초기화 방식으로 생성
regExp.test('문자열');			        //--- true. 문자열에서 regExp 패턴이 탐지됨
'문자열'.match(regExp);                        //--- null. 탐지 안됨, 탐지된 문자열의 배열
regExp.exec('문자열');		 	        //--- '문자열'.match(regExp)와 유사한 결과
'문자열'.search(regExp);			//--- -1. 탐지 안됨, n. 탐지된 위치 (0, 1, 2, …)
'문자열'.replace(regExp, '~');			//--- 탐지한 값을 '~'로 치환
  • replace(regExp, xxx)
  • xxx 부분에 $1, $2 등을 사용할 수 있음
  • xxx 부분에 함수를 사용할 수 있음
'문자열'.replace(regExp, function(str) {
    return str + '!';
});
  • RegExp 사용 사례
/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/			         //--- 한글 포함 여부 탐지
/\d{3}-?\d{3}/				         //--- 우편번호
/\(?(\d{2,3})\)?[ -.](\d{3,4})[ -.](\d{4})/	 //--- 전화번호
/[-\w.]+@([ A-z0-9][ -A-z0-9]+\.)+[ A-z]{2,4}/	 //--- 이메일 주소
/(\d[4])[-/\ .] ([01]?\d)[-\/ .] ([ 0123]?\d)/	 //--- 날짜
/((\bhttps?:\/\/) | (\bwww\.))\S*/		 //--- 웹 주소
/^((https?:\/\/) | (www\.))\S*$/		 //--- 웹 주소 상세

Java

  • RegExp 변수 생성
  • Pattern.COMMENTS flag : 공백 무시, #뒤에 주석 사용
  • Pattern.CASE_INSENSITIVE flag : 대소문자 구별을 하지 않음
  • Pattern.UNICODE_CASE flag : 유니코드 캐릭처 속성에 종속 (\w, \b, \s 등)
  • Pattern.DOTALL flag : 마침표는 개행 문자와 일치 (. 사용시 줄 바뀜 허용)
  • Pattern.MULTILINE flag : 줄이 바뀌어도 검색
import  java.util.regex.*;

Pattern regExp = null;
Matcher matcher = null;

try {
    regExp = Pattern.compile("정규표현식", flag);	//--- flag는 |로 연결
    matcher = regExp.matcher("문자열");		//--- matcher.reset("새 문자열");
    while (matcher.find()) {
        matcher.group();			//--- 일치하는 문자열 반환
    }
} catch (PatternSyntaxException ex) {		//--- 정규식 문법 오류
} catch (IllegalArgumentException ex) {		//--- 치환 텍스트 문법 오류
} catch (IndexOutOfBoundsException ex) {	//--- 존재하지 않는 캡처 그룹 참조
}
  • Matcher 함수

RegExp Java Matcher.png

Python

  • RegExp 변수 생성
  • 역참조 : \1, \2, \3, … 사용
import  re
#-*- coding:UTF-8 -*-

matchObject = re.match(r'정규표현식', '문자열', flag = 0);	//--- 패턴이 전체 문자열과 일치
matchObject = re.search(r'정규표현식', '문자열', flag = 0);	//--- 일치하는 첫번째 검색
list = re.findall(r'정규표현식', '문자열', flag = 0);		//--- 일치하는 것의 list 반환
#--- [ ($1, $2, $3), ($1, $2, $3) ]
list = re.split(r'정규표현식', '문자열', maxsplit = 0, flag = 0);	//--- 패턴으로 문자열 분리

resultString = re.sub(r'정규표현식', r'교체_문자열', '문자열', count = 0, flag = 0);	//--- 치환
#--- count : 0. 전체 매핑 문자열 치환, n. 해당 개수만큼 치환
def repl(m):
    return m.group(1) + m.group(3)
re.sub(r'정규표현식', repl, '문자열');			//--- 함수를 사용하여 치환

regExp = re.compile(r'정규표현식', flag = 0);		//--- 정규표현식 재사용
m = regExp.search('문자열', flag = 0);
  • Match Object

RegExp Python Match Object.png

  • RegExp용 flag (|로 연결)
  • re.VERBOSE, re.X : 공백 무시 , #뒤에 주석 사용
  • re.IGNORECASE, re.I : 대소문자 구별을 하지 않음
  • re.UNICODE, re.U : 유니코드 캐릭처 속성에 종속 (\w, \b, \s 등)
  • re.LOCALE, re.L : 현재 로케일에 정속적인 처리 (\w, \b, \s 등)
  • re.DOTALL, re.S : 마침표는 개행 문자와 일치 (. 사용시 줄 바뀜 허용)
  • re.MULTILINE, re.M : 줄이 바뀌어도 검색
  • re.DEBUG : 디버깅 정보 표시
  • Raw string literal
  • 문자열에서 특수 문자를 표현하기 위해서 사용하는 escape sequence를 사용하지 않을 수 있도록 해주는 표현 방식
//--- 기존 방식으로 문자열 표현
str = 'Hello\nworld!\n'

//--- Raw string literal 방식으로 문자열 표현
str = r'Hello
world!
'
  • Unicode literal : u'유니코드_문자열"
re.match(ur'정규표현식', u'문자열", re.UNICODE)

참고 문헌