> For the complete documentation index, see [llms.txt](https://nelmm.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nelmm.gitbook.io/til/common/regex.md).

# 정규 표현식

[위키백과](https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D)에 따르면 `정규 표현식`은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

어떤 문자열을 특정 패턴에 부합한지 `검사`하거나 특정 패턴에 부합한 문자열을 `출력`하는데 사용된다.

대부분의 프로그래밍 언어에서 지원하며, 일부(perl, js, ruby)는 `내장`되어 있고, 다른 일부(python, c, c++, java)는 `표준 라이브러리`로 제공한다.

매번 공부 할만큼 했다 생각해도 가끔 사용하다보니 까먹게 되어 찾아볼 목적으로 정리 해 보았다.

<br>

## 공부 하는데 도움되는 사이트

[RegExr](https://regexr.com/) 을 이용하여 아래 기호들을 적용해보며 공부

\ <br>

## 기호(표현식)와 의미

<br>

|    기호    |                의미                |
| :------: | :------------------------------: |
|     ^    |              문자열의 처음             |
|     $    |              문자열의 끝              |
|     .    |              한개의 문자              |
|    \*    |               0번 이상              |
|     +    |             반복 (1번이상)            |
|    {}    |                반복                |
|     ?    |    존재 여부 ( 있을 수도 있고 없을 수도 있다 )   |
|    \|    |          OR ( 두 식중 한개 )          |
|   \[ ]   |       문자 선택 (괄호 안의 문자 중 한개)      |
|   \[^ ]  |      부정 ( 괄호 안의 문자들을 선택 안함 )     |
| \[a - z] |            a 부터 z중 한개            |
|    ( )   |          그룹을 표현 (포획 괄호)          |
|   (?:)   |         그룹을 표현 ( 비포획 괄호 )        |
|   (?=x)  |            뒤에 x가 와야한다            |
|   (?!x)  |           뒤에 x가 오면 안된다           |
|          | n은 1부터 9까지 가능하며, 순서에 맞는 포획괄호 재사용 |
|    \b    |     문자와 공백 사이 (word boundary)    |
|    \B    |  문자와 공백 사이 (word boundary)가 아니다  |
|    \d    |                숫자                |
|    \D    |              숫자가 아니다             |
|    \s    |           공백 (space)과 탭          |
|    \S    |            공백과 탭이 아니다            |
|    \w    |     word( 알파벳, 숫자, \_ ) 중에 하나    |
|    \W    |             word가 아니다            |
|          |                줄바꿈               |
|          |              캐리지 리턴              |
|          |                tab               |
|    \v    |      수직 tab (캐리지리턴 + 라인 피드)      |
|    \0    |               null               |

\ <br>

## flag 옵션

<br>

| flag |                    의미                    |
| :--: | :--------------------------------------: |
|   g  |        global ( 대상 문자열내 모든 패턴 검색 )       |
|   i  |   insensitive (대상 문자열에서 대/소문자 식별하지 않는다)  |
|   m  | multiline ( 줄바꿈이 포함된 여러라인의 문자열일 경우에도 검색) |

\ <br>

## 사용 예

<br>

\| 기호 | 의미 | | :-----------: | :----------------------------------------: | --------------------------- | | `^`x | 문자열이 문자 x로 시작된다 | | x`$` | 문자열이 문자 x로 끝난다 | | `.` | 모든 문자 | | x`.` | 2글자 문자중 x로 시작하는 문자 | | `.`x`.` | 3글자 문자중 가운데 x인 문자 | | x`+` | x가 1번 이상 반복된다. `x{1,}`와 같은 의미 | | x`*` | x가 0번 이상이다. `x{0,}`와 같은 의미 | | x`?` | x가 있을 수도 있고 없을 수 있다. | | abc `|` qwe | 문자 abc와 문자 qwe 중 한개 | | `[`abc`]` | a,b,c중 한 문자 | | `[^`abc`]` | a,b,c가 포함되지 않은 문자 | | `[`a `-` z`]` | a 부터 z중 한개 | | a`(?=`x`)` | 뒤에 x가 있는 a | | a`(?!`x`)` | 뒤에 x가 없는 a | | `{`m`}` | m번 반복 | | `{`m`,}` | m번 이상 반복 | | `{`m`,`n`}` | m번 이상 n번 이하 반복 | | `\1` | 첫번째 포획괄호 재사용 | | `\2` | 두번째 포획괄호 재사용 |
