-
[CS] 정규 표현식 Regular Expression, RegexComputer Science/CS 2023. 1. 19. 23:13728x90
Regular Expression
정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어입니다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있습니다.
기본 개념
패턴(pattern)으로 부르는 정규 표현식은 특정 목적을 위해 필요한 문자열 집합을 지정하기 위해 쓰이는 식입니다.
| 여러 항목 중 선택, A | B 는 "A" or "B" 와 일치한다는 의미. () 괄호를 사용하여 연산자의 범위와 우선권 정의. gr(a|e)y 는 "gray" or "grey" 집합을 둘 다 기술하는 동일 패턴 ? 0번 or 1차례까지의 발생을 의미. colou?r 는 "color"와 "colour"를 둘 다 일치 시킴 * 별표는 0번 이상의 발생을 의미. ab*c 는 "ac" , "abc", "abbc", "abbbc" 등을 일치 시킴 + 덧셈 기호는 1번 이상의 발생읠 의미. ab+c 는 "abc", "abbc", "abbbc" 등을 일치시키지만 "ac"는 일치시키지 않음 {n} 정확히 n번 만큼 일치 시킴 {min, } "min"번 이상 만큼 일치 시킴 {min, max} 적어도 "min"번 만큼 일치시키지만 "max"번을 초과하여 일치시키지 않음 문법
정규 표현식의 패턴은 대상 문자열과 일치시킵니다. 이 패턴은 일련의 원자로 구성됩니다. 하나의 원자는 정규 표현식 패턴 안의 하나의 점이며, 대상 문자열과 일치시키기 위해 존재합니다. 가장 단순한 형태의 원자는 Literal이지만 원자를 일치시키기 위해 패턴을 묶을 때에는 Meta문자로서 ( )를 사용해야 합니다.
Meta문자는
- 원자 외에도 얼마나 많은 원자가 있는지를 가르키는 Quantifier(수량자)
: 패턴이 얼만큼 등장하는 가
- 선택적 대안을 가리키는 논리적 OR문자
- 원자의 존재를 부정하는 NOT문자
- 전에 일치된 원자를 참조할 수 있게 하는 역참조(backreference)
를 만드는 것을 도와줍니다.
구분 문자로 / 를 사용하는 경우도 있습니다.
수량자
▶ Greedy Quantifier (탐욕적인 수량자)
*, +, {n,}
수량자 선택:
<div> <p>First</p> <p>Second</p></div>
대상 :
r"<p>(.+)</p>"
결과 :
'First</p> <p>Second'
First와 Second 따로 선택하고 싶어도 위와 같이 수량자를 선택하면 전체가 한개로 선택 됩니다. (처음 만족하는 부분부터 마지막 만족하는 부분까지 모두 선택)
▶ Lazy Quantifier (게으른 수량자)
*?, +?, {n,}?
대상 :
r"<p>(.+?)</p>"
결과 :
'First', 'Second'
만족하는 부분만 선택하게 됨(만족하는 부분이 여러개라면 여러개 선택 됨)
정규 표현식 용어
관련 문법 내용 기 호 의 미 기본 메타 문자 . (애니) 모든 문자와 일치 (한 문자) |(버티컬 바) 왼쪽 혹은 오른쪽과 일치 [^] 문자 집합 구성원 중 하나와 일치 - 문자 집합 구성원을 제외하고 일치 \ 다음에 오는 문자를 이스케이프 수량자 * 문자가 없는 경우나 하나 이상 연속하는 문자 찾기 *? 게으른 * 문자 + 문자 하나 이상 찾기 +? 게으른 + 문자 ? 문자가 없거나 하나인 문자 찾기 {n} 정확히 요소와 n번 일치 {m, n} 요소와 m에서 n번 일치 {n, } 요소와 n번 이상 일치 {n, }? 게으른 {n, } 위치 지정 ^ (캐럿) 문자열의 시작과 일치 \A 문자열의 시작과 일치 $ (달러) 문자열의 끝과 일치 \Z 문자열의 끝과 일치 \< 단어의 시작과 일치 \> 단어의 끝과 일치 \b 단어의 경계와 일치 \B \b와 반대로 일치 특수한 문자 [\b] 역 스페이스 \c 제어문자와 일치 \d 모든 숫자와 일치 \D /d와 반대 \f 페이지 넘기기 (form feed) \n 줄바꿈 \r 캐리지 리턴 \s 공백 문자와 일치 \S \s와 반대로 일치 \t 탭 \v 수직 탭 \w 영숫자 문자나 밑줄과 일치 \W \w와 반대로 일치 \x 16진수 숫자와 일치 \0 (숫자) 8진수 숫자와 일치 역참조와
전후방 탐색( ) 하위 표현식 정의 \1(숫자) 첫번째 일치한 하위 표현식,
두번째로 일치한 하위 표현식은 \2로 표기하는 방식?= 전방탐색 ?<= 후방탐색 ?! 부정형 전방탐색 ?<! 부정형 후방탐색 ?(backreference)true 조건 지정 ?(backreference)true|false else 표현식 조건 지정 대소문자 변환 \E \L 혹은 \U 변환을 끝냄 \I 다음에 오는 글자를 소문자로 변환 \L \E를 만날 때까지 모든 문자를 소문자로 변환 \u 다음에 오는 글자를 대문자로 변환 \U \E를 만날 때까지 모든 문자를 대문자로 변환 변경자 (?m) 다중행 모드 위의 표 반복.
표현식의미^x문자열의 시작을 표현하며 x 문자로 시작됨을 의미 x$문자열의 종료를 표현하며 x 문자로 종료됨을 의미 .x임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미 x+반복을 표현하며 x 문자가 한번 이상 반복됨을 의미 x?존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미 x*반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미 x|yor 를 표현하며 x 또는 y 문자가 존재함을 의미 (x)그룹을 표현하며 x 를 그룹으로 처리함을 의미 (x)(y)그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리 (x)(?:y)그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미 x{n}반복을 표현하며 x 문자가 n번 반복됨을 의미 x{n,}반복을 표현하며 x 문자가 n번 이상 반복됨을 의미 x{n,m}반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미 표현식의미[xy]문자 선택을 표현하며 x 와 y 중에 하나를 의미 [^xy]not 을 표현하며 x 및 y 를 제외한 문자를 의미 [x-z]range를 표현하며 x ~ z 사이의 문자를 의미 \^escape 를 표현하며 ^ 를 문자로 사용함을 의미 \bword boundary를 표현하며 문자와 공백사이의 문자를 의미 \Bnon word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미 \ddigit 를 표현하며 숫자를 의미 \Dnon digit 를 표현하며 숫자가 아닌 것을 의미 \sspace 를 표현하며 공백 문자를 의미 \Snon space를 표현하며 공백 문자가 아닌 것을 의미 \ttab 을 표현하며 탭 문자를 의미 \vvertical tab을 표현하며 수직 탭(?) 문자를 의미 \wword 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미 \Wnon word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미 정규 표현식을 사용할 때 flag를 설정할 수 있습니다.
flag를 설정하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 됩니다.
Flag의미gGlobal 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. iIgnore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다. mMulti line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. 예제
[0-9]*$: 숫자
^[a-zA-Z]*$: 영문자. 패턴변경자를 써서 /^[a-z]*$/i 같이 쓸 수 있다.
전화번호 - /^\d{3}-\d{3,4}-\d{4}$/
시작을 숫자 3개 / 하이픈 - 하나 존재 / 숫자가 3~4개 존재 / 하이픈 하나 존재 / 숫자 4개, 끝남
핸드폰 번호 - /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
시작, 숫자 01로 시작, 0,1,6,7,8,9 중에 하나가 / 하이픈 - 하나 존재 / 숫자 3~4개 / 하이픈 - 하나 / 숫자 4개
이메일 - /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
시작, 0~9 사이 숫자 or a-z A-Z 알바펫 중에 시작 / 중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며 /
0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 / @ 가 반드시 존재 /
0-9a-zA-Z 여기서 하나가 있고 / 중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며 / 그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 / 반드시 . 이 존재하고 / [a-zA-Z] 의 문자가 2~ 3개 존재 / 전체 대소문자 구분안함
URL - ^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$
레퍼런스
https://namu.wiki/w/%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D
728x90'Computer Science > CS' 카테고리의 다른 글
[Network] TCP/IP, OSI 7 Layer, UDP (0) 2023.05.15 [CS] Gradle (0) 2023.03.03 [CS] Graph, Tree (0) 2022.11.28 [CS] 동기 비동기 프로그래밍 (0) 2022.09.07 [CS] Windows kernel programming (0) 2022.09.07