CS지식

정규표현식

hminor 2023. 6. 1. 14:04

정규표현식

  • 텍스트 검색, 치환에 사용
  • 수십 라인의 프로그래밍 없이 정규식 1~2줄로 대부분의 문자열로 작업 가능
  • 선배들의 노하우가 담긴 파워풀한 텍스트 관련 도구
  • 익숙해진다면 손 빠른 개발에 큰 도움을 줄 수 있음
  • 온전한 프로그래밍 언어는 아님
  • 다른 프로그래밍 언어나 제품에 포함된 '작은 언어'의 느낌
  • 제품마다 조금씩 다른 문법

정규 표현식 사용예시

  • email, 주민번호, 생년월일 등의 형식 검증
  • 텍스트를 취급하는 개발 코드 작성
  • (텍스트) 데이터의 전처리 작업
  • 프로젝트 리팩토링 작업
  • Database 검색, 치환 작업

[정규 표현식 온라인 테스트 도구](https://regexr.com/)

 

문자 하나 찾기

  • 일반적인 문자 그대로 기재
  • '.'와 같은 메타 문자를 검색하려면 '\'로 이스케이프
/sales\.xls/g  

sales.xls 
sales,xls 
orders3.xls 
park1.xls 
kim.xls

문자 집합으로 찾기

  • 대괄호([])를 사용하여 문자 집합 표현
  • [] 집합에 속한 문자 가운데 하나가 일치
  • [] 내에 '-'은 연속 요소를 표현 [1-5] -> [12345]
  • 캐럿("^")문자는 집합 안에 있는 문자나 범위를 모두 제외

반복 찾기

  • 파워풀한 정규 표현 패턴의 능력
  • '+' : 하나 이상 일치
  • '*' : 없거나 하나 이상 일치
  • '?' : 없거나 하나 일치
  • 중괄호 '{}'내에 반복 횟수 기재 ex) {3} : 3번
  • 게으른 수량자로 문자를 최소로 일치

위치 찾기

  • 텍스트 영역 내 특정 위치에서 검색 희망
  • '\b' : 단어 경계
  • '^' : 문자열 경계의 시작
  • '$' : 문자열 경계의 끝

하위 표현식

  • 큰 표현식 안에 속한 일부 표현식을 한 항목으로 다루도록 묶음
  • '()' : 괄호로 묶음 가능
  • \>{2,} vs (\>){2,}
  • 파워풀한 중첩된 하위 표현식

하위 표현식 - 역참조

  • 하위 표현식으로 매칭된 타겟을 참조
  • 일치한 부분을 반복해 찾거나 치환에 사용
  • 텍스트를 검색하고 치환하는데 매우 유용
  • ex)
'Tere is a ball on on the table' : 실수로 중복된 전치사  

/(\w+) \1/g

전방 탐색

  • 일치 영역을 발견해도 그 값을 반환하지 않는 패턴
  • 실제로는 하위 표현식이며 같은 형식으로 작성
  • (?=일치할 테스트)
http://project.vailish.com 

/.+(?=:/g)

후방 탐색

  • 전방 탐색과 동일한 개념으로 방향만 역방향
  • (?<=일치할 텍스트)
http://project.vailish.com  

/(?<=\/\/).+/g

 

자주 사용하는 정규 표현식 (JAVA)

/** 정규표현식 예시 ex) 자바 */
import java.util.regex.Pattern;
 
/** 문자열의 형식을 검사하는 기능을 갖는 클래스 */
public class PatternChecker {
     
    /** 숫자 모양에 대한 형식 검사 */
    public static boolean isNum(String str) {
        return Pattern.matches("^[0-9]*$", str);
    }
     
    /** 영문으로만 구성되었는지에 대한 형식 검사 */
    public static boolean isEng(String str) {
        return Pattern.matches("^[a-zA-Z]*$", str);
    }
     
    /** 한글로만 구성되었는지에 대한 형식 검사 */
    public static boolean isKor(String str) {
        return Pattern.matches("^[ㄱ-ㅎ가-힣]*$", str);
    }
     
    /** 영문과 숫자로만 구성되었는지에 대한 형식 검사 */
    public static boolean isEngNum(String str) {
        return Pattern.matches("^[a-zA-Z0-9]*$", str);
    }
     
    /** 한글과 숫자로만 구성되었는지에 대한 형식 검사 */
    public static boolean isKorNum(String str) {
        return Pattern.matches("^[ㄱ-ㅎ가-힣0-9]*$", str);
    }
     
    /** 이메일 형식인지에 대한 검사 --> "아이디@도메인"의 형식을 충족해야 한다. */
    public static boolean isEmail(String str) {
        return Pattern.matches("[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$", str);
    }
     
    /** 핸드폰번호인지에 대한 형식검사.
        반드시 앞자리가 010,010,016~9사이를 충족해야 하며,
        각 부분에 대한 자리수도 충족시켜야 한다.
        "-"는 허용하지 않는다. */
    public static boolean isCellPhone(String str) {
        return Pattern.matches("^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$", str);
    }
     
    /** 전화번호인지에 대한 형식검사. 각 연결부는 "-"로 구분되어야 한다.
        각 부분에 대한 자리수도 충족시켜야 한다.
        "-"는 허용하지 않는다. */
    public static boolean isTel(String str) {
        return Pattern.matches("^\\d{2,3}-\\d{3,4}-\\d{4}$", str);
    }
     
    /** 주민번호에 대한 글자수 및 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사.
        "-"는 허용하지 않는다. */
    public static boolean isJumin(String str) {
        return Pattern.matches("^\\d{6}[1-4]\\d{6}", str);
    }
     
    /** 아이피주소 형식에 대한 검사 */
    public static boolean isIP(String str) {
        return Pattern.matches("([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})", str);
    }
}

'CS지식' 카테고리의 다른 글

Mordern Java with Python  (0) 2023.06.01
JIRA란?  (0) 2023.06.01
GIT & JIRA  (0) 2023.06.01
서비스 플랫폼  (0) 2023.06.01
DB 설계  (0) 2023.06.01