정규 표현식

YunGyu Choi·2023년 8월 22일
0

Computer Science

목록 보기
6/6

정규표현식(Regular Expression)

  • 실제 값은 다르지만 패턴은 서로 동일한 문자열을 표현할 때 사용되는 형식 언어
  • 개발이나 데이터 분석에서 다양하게 활용

0. 실습환경

regex101

  • FLAVOR
    어떤 프로그래밍 언어 기반으로할지 등을 설정
    (학습 환경은 ECMAScript(JavaScript) 기준)
  • TEST STRING
    실습할 텍스트 본문 입력하는 곳
  • REGULAR EXPRESSION
    원하는 정규식을 작성하는곳. 이곳에 정규 표현식을 작성하면 TEST STRING에 입력된 문자열 중 해당 정규 표현식에 일치하는 부분 하이라이트
  • EXPLANATION
    사용자가 입력한 정규 표현식을 해석한 내용을 보여줌
  • MATCH INFORMATION
    필요한 정규 표현식 문법으 검색하고 찾아볼 수 있음

1. 기본 문법

정규 표현식으로 하나의 문자 또는 단어를 찾기 위해선 그 문자를 그대로 입력해주면 된다.

1) 집합

집합이란?

  • 표현하고 싶은 문자를 대괄호에 넣는 식으로 사용
  • 대괄호 안에 들어간 문자들은 or 연산이 적용되어 집합 안에 있는 문자 중 하나라도 매칭되면 선택
// ex1. 집합을 이용해서 bar, var, ear 를 선택하기!
[bce]ar

// ex2. 숫자만 선택하기!
[0123456789]
// ex3. 알파멧만 선택하기!

[ABCDEFGHIJKLMNOPQRSTUVWXYZ][abcdefghijklmnopqrstuvwxyz]
// ex3-2. 대소문자 구분할 필요 없는 경우, Flag 사용```
  • 플래그는 정규 표현식에 적용되는 설정을 조절해주는 옵션
  • regex101에는 기본적으로 gm 플래그가 설정되어 있음
    - g: 패턴과 일치하는 모든 것을 찾는다.
    • i: 대소문자 구분 없이 찾는다.
    • m: 정규 표현식은 전체 문자열을 하나의 문작으로 인식한다. 보통 사람이 줄 바꿈 문자를 기준으로 문장을 나누 듯 정규 표현식에도 문자열을 여러 줄로 인식하도록 하기 위해선 m(multiline)플래그가 필요하다.

하이픈과 캐럿

  • 하이픈 : 문자들을 범위로 지정해서 사용
    숫자 : [0-9]
    영어 : [a-z][A-Z]
    한글 : [가-힣]
    숫자와 영어대문자 : [0-9A-Z]

  • 하이픈 사용시 주의사항
    아스키 코드를 기준으로 범위를 계산하기 때문에 [A-z]라고 명시하면 원하지 않는 단어도 선택된다.

  • 캐럿 : 집합 안의 특정 문자를 제외하여 선택하고 싶을 때 사용
    숫자만 제외 : [^0-9]

  • 캐럿 사용시 주의사항
    캐럿은 집합 안에 있는 모든 문자를 제외시킨다.
    또 부정의 의미로 사용할 때는 집합에 가장 처음에 위치해야한다.

// ex4. 이름 나이(숫자) 자료구조에서 이름과, 30대만 선택하기
[가-힣][가-힣] [34][0-9]```

2) 문자 클래스

  • 자주 사용하는 집합들을 좀 더 쉽게 사용할 수 있도록 한 일종의 예약어
  • 보통 백슬러시 뒤에 특정 알파벳을 합쳐서 표기
    숫자 : \d
    영어 대소문자 + 숫자 + 언더바 : \w
    공백문자 : \s
    숫자가 아닌 것 : \D
    영어 대소문자 + 숫자 + 언더바 아닌 것 : \W
    공백 문자가 아닌 것 : \S
(조건1) ID에는 알파벳 소문자(a-z), 대문자(A-Z), 숫자(0-9)를 사용할 수 있습니다.
(조건2) 특수 문자는 사용이 안되지만 $, -, +, _만 예외적으로 사용이 가능합니다.
(조건3) 예외적으로 사용 가능한 특수문자를 제외한 특수문자가 사용되었거나, 공백이 들어간 경우는 ID 생성이 되지 않습니다.

[^\w$+\n-]```

3) 메타 문자

  • 문자열의 특정한 규칙을 좀 더 쉽게 표현할 수 있도록 만들어진 예약어
  • 정규 표현식에서 원하는 방식으로 규칙을 찾게 해주는 예약어
  • 대괄호, 하이픈, 캐럿 모두 메타문자
    Dot(.) : 모든 문자 의미
    butDot(.)도 \n 개행 문자는 표현하지 못한다.
    (Flag s 옵선을 추가하면 개행문자도 포함할 수 있다.)
h.```

4) 이스케이핑()

  • 대괄호, 캐럿, Dot 등의 문자를 메타 문자가 아니라 일반 문자로 사용하고 싶을 때 사용
\.```

5) 수량자

  • 문자의 반복 횟수를 설정하는 문법 -> 반복하고 싶은 문자{수량자}
  • 반복하고 싶은 문자 부분에는 일반 문자, 집합, 문자 클래스, 메타 문자, 하위 표현식 가능
    수량자 기본표현 : {n}
    수량자 범위 지정 : {min, max}
    수량자 메타 문자(*) : 제한 없이 모든 숫자, 앞에 문자가 하나도 없어도 선택
    수량자 메타 문자(+) : 제한 없이 모든 숫자, 최소 1개 문자 반드시 필요
    수량자 메타 문자(?) : 문자가 아예 없거나 하나만 있을 경우 선택
ex8. 숫자가 4번씩 반복되는 경우 선택
[0-9][0-9][0-9][0-9]
\d\d\d\d
\d{4}

ex9. 숫자가 3개 이상인 경우 선택
\d{3,}

ex10. 얼마가 오든 선택
\d+원```

탐욕적 수량자(*,+,{min})

  • 정규 표현식에 부합하는 여러 케이스가 있을 때 가장 큰 덩어리의 문자열을 선택해 버리는 수량자

게으른 수량자(?)

  • 문자를 원하는 만큼만 일치시키기 위해 사용하는 수량자
  • ?는 단독으로 쓰일땐 0번 또는 1번 반복되는 문자를 찾는 수량자였다.
  • 하지만 다른 수량자와 중첩해서 사용하면 앞에온 수량자가 게으른 수량자가 된다.

6) 경계

  • 경계가 필요한 이유 : This is island에서 is만 선택하고 싶은데 This나 island에 포함된 is까지 선택됨

단어 경계

문자와 문자가 아닌 곳 사이의 위치를 나타내는 메타 문자 : \b
단어의 경계가 아닌 위치를 나타내는 메타 문자 : \B

\bis\b

ex12. This를 선택하고 싶은 경우
\Bis\b

ex13. island를 선택하고 싶은 경우
\bis\B```

문장 경계

  • 문장 시작점을 나타내는 캐럿(^)과 문장 끝 지점을 나타내는 달러 기호($)를 사용해 단어가 아닌 문장의 경계 나타낼 수 있다.
  • 캐럿(^)은 집합 안에서 쓰이면 부정이지만 집합 밖에서 쓰이면 경계의 의미를 갖게 된다.
  • 참고로 플래그 옵션중 m을 추가한 경우와 하지 않은 경우 결과가 다르다.
    (m은 줄바꿈을 문장 경계의 기준으로 허용하는지 여부를 나타내는 옵션이다.)

7) 하위 표현식

  • 전체 정규 표현식 안에서 특정 패턴을 나타내는 표현식을 하나의 항목으로 처리하는 것
  • 메타 문자 소괄호를 사용해 나타낸다.
    가독성이 좋다. (010)-(\d{3,4})-(\d{4})
    반복하기 좋다. (\d{1,3}.){3}\d{1,3}
    OR(|) 연산 활용하기 좋다. (19|20)\d{2}

8) 플래그 옵션

  • g : 정규 표현식은 일치하는 패턴 하나를 찾으면 그대로 종료, 하지만 플래그 g 사용하면 일치하는 모든 부분 선택
  • i : 정규 표현식은 기본적으로 대소문자를 구분, 그래서 소문자 this로는 대문자 This를 선택할 수 없지만, 플래그 i를 사용하면 대소문자 구분 없이 알파벳이 일치하면 선택
  • m : 원래는 문장의 처음과 끝만 경계의 기준이 되지만, 플래그 m을 설정해 주면 줄 바꿈이 된 곳을 문장의 경계로 인식 가능
  • s : 모든 문자와 매칭하는 메타 문자 Dot이 줄 바꿈 문자(\n) 도 포함하도록 설정하는 플래그, 플래그를 사용하지 않으면 줄 바꿈이 되기 전까지만 인식이 됐는데, 플래그 s를 설정하니 모든 문자가 전부 다 선택

2. 심화 문법

1) 역참조

''' ex14. 앞에서 한 번 사용된 단어가 반복해서 나온 경우를 참조하고 싶은 경우
(\w+)\s\1 '''

\w를 하위 표현식으로 만들어준 뒤
공백을 나타내는 메타문자 \s 뒤에
\1이라는 형태로 역참조

하위 표현식이 여러개인 경우에는 괄호의 순서에 따라 왼쪽에서 오른쪽으로 자동으로 번호가 매겨지는데 이 번호를 통해 원하는 하위 표현식을 역참조 할 수 있다.

주의할 점은 프로그래밍 언어에 따라 $1, $2, \1, \2와 같이 역참조를 표현하는 기호가 다르다.

2) 치환

  • 위에서 배운 정규 표현식의 문법들은 대부분 검색 목적으로 활용된다.
  • 치환은 특정 문자 패턴과 일치하는 문자열을 찾아서 문자를 바꾸는 역할을 한다.

1) 바꿀 문자열을 정교 표현식으로 표현하고,
2) 바꾸고 싶은 문자열을 FUNCTION - Substitution 부분에 작성하면 된다.

3) 전방 탐색과 후방 탐색

  • 전방 탐색과 후방탐색은 하위 표현식이지만 결과에는 반영되지 않고 특정 문자열을 찾기 위한 조건 역할만 하는 문법
  • 문자열을 찾기 위한 패턴의 일부가 되지만 해당 정규 표현식으로 찾아지는 문자열 결과에는 반영되지 않는 하위 표현식

전방탐색 (lookahead)

  • 문자열의 앞부분 부터 탐색하여 조건에 해당하는 부분이 확인 되면 해당 조건 뒤쪽의 부분을 생락하기 위해 사용 -> (?= )

  • (ex15.) (010)-(\d{4})까지 일치하면서 뒤에 4자리 숫자가 오는 문자열을 찾아서 앞에 세 자리 숫자와 가운데 네 자리 숫자, 그리고 그 사이의 하이픈만을 선택하는 정규 표현식

후방탐색 (lookbehind)

  • 문자열을 뒤쪽부터 탐색하여 조건에 해당하는 부분이 있는지 확인하고, 해당 조건에 해당하는 문자열에 대하여 후방 탐색이 걸린 부분을 제외한 나머지 값들을 선택 -> (?<= )

  • (ex16.)

부정 전방탐색과 부정 후방탐색

부정 전방탐색 : (?! )
부정 후방탐색 : (?<! )

profile
velog에는 이론을 주로 정리하고, 코드와 관련된 것은 Git-hub로 관리하고 있어요. 포트폴리오는 링크된 Yun Lab 홈페이지를 참고해주시면 감사하겠습니다!

0개의 댓글