Regex, 정규식을 쓰자! - Tirrilee/TechTalk GitHub Wiki

Regex

정규식은 일반적으로 /으로 감싸진 형태로 이루어집니다.

메타 방정식

.     : 모든 문자와 일치합니다.
[]    : 대괄호 사이에 존재하는 문자들 중 하나에 일치합니다.
[^]   : 대괄호 사이의 가장 첫 번째 문자로 ^ 문자가 있을 때, 그 문자 이후에 존재하는 문자들을 제외한 모든 문자와 일치합니다.
[a-z] : 대괄호 사이에서 특정문자1-특정문자2가 존재할 때, 특정문자1과 특정문자2사이의 모든 문자와 일치합니다. [a-z]의 경우, a 부터 z까지 모든 영문자 소문자와 일치합니다.
^     : 대괄호 사이에 존재할 때는 부정을 나타내지만, 대괄호 밖에서는 문자열의 시작과 일치합니다.
$     : ^와 반대로, 문자열의 끝과 일치합니다.
*     : 앞에 존재하는 문자가 0번 혹은 그 이상 반복되는 문자를 찾을 때 사용합니다.
+     : 앞에 존재하는 문자가 1번 혹은 그 이상 반복되는 문자를 찾을 때 사용합니다.
?     : 앞에 존재하는 문자가 있을 수도, 없을 수도 있을 때 사용합니다.
\     : . 혹은 [] 등 특수한 목적으로 사용되는 메타 문자를 문자열에서 찾고 싶을 때, 메타 문자를 문자 그대로 사용할 수 있도록 변환해주는 기호입니다. .은 모든 문자와 일치하지만, \.의 경우, .문자와 일치합니다.

패턴

\d : 숫자와 일치합니다.
\w : 영문자 및 _ 문자와 일치합니다.
\s : 여러 가지 공백 문자와 일치합니다. (* 스페이스, 탭, 기타… 공백 문자)

\D : 숫자를 제외한 문자와 일치합니다.
\S : 공백 문자를 제외한 문자와 일치합니다.
\W : 영문자 및 _ 문자를 제외한 문자와 일치합니다.

특정 문자수 지정

{n}     : 앞에 존재하는 문자가 n번 반복되는 문자와 일치합니다.
{n, m}  : 앞에 존재하는 문자가 n번 이상 m번 이하 반복되는 문자와 일치합니다.
{n,}    : 앞에 존재하는 문자가 n번 이상 반복되는 문자와 일치합니다.

Lazy 방식

#정규식
i\w+n

#예시
internationalization

이라면 i로 시작하고 n으로 끝나는 값을 찾을 것입니다. 즉 internationalization을 찾습니다.

#정규식
i\w+?n

#예시
internationalization

하지만 위와 같이 ?를 써서 lazy형식을 유지한다면 i로 시작하고 n으로 끝나는 모든 글자를 찾습니다. 예를 들어 위에서 찾는 글자는 intern ion ization 입니다.

그룹

() 문자로 그룹을 지정할 수 있으며 ()안에 있는 문자는 하나의 묶음으로 처리됩니다.

그룹은 일반적으로 \1 와 같이 \문자 + 그룹번호 로 이루어집니다. 일반적으로 전체 결과가 \0이며 앞에서부터 나타나는 그룹의 순서에 따라 숫자가 하나씩 증가하는 방식입니다.

<(h[1-6])>[가-힣\w\s]+<\/\1>
<h2> 맞는 문법 </h2>
<h3> 틀린 문법 </h4>

탐색

(?=)  : 전방탐색. 찾고자 하는 표현식 뒤에 전방탐색 표현식을 넣으며(?=와 ) 사이에 표현식을 넣습니다. 전방탐색 표현식을 통해 문자가 존재하고, 그 앞에 찾고자 하는 문자가 존재할 때 일치합니다. 특정 문자가 포함된 문자를 찾고 싶지만 결과에 포함하고 싶지는 않을 때 사용합니다.
(?<=) : 후방탐색. 후방탐색 표현식 (?<=와 ) 사이에 표현식을 넣고, 찾고자 하는 표현식을 작성합니다. 후방탐색 표현식을 통해 문자가 존재하고, 그 뒤에 찾고자 하는 문자가 존재할 때 일치합니다.

(?!)  : 부정형 전방탐색. 전방탐색과 반대로, 부정형 전방탐색 내의 표현식이 일치하지 않고, 찾고자 하는 문자가 존재할 때 일치합니다.
(?<!) : 부정형 후방탐색. 후방탐색과 반대로, 부정형 후방탐색 내의 표현식이 일치하지 않고, 찾고자 하는 문자가 존재할 때 일치합니다.

예를 들어 아래와 같습니다.

\d+(?=원)

2400원     (O)
238493엔   (X)
원2839283  (X)

역참조

(?(n)) : ?(n)의 n에 그룹의 번호를 넣습니다. 이 뒤에 나타나는 것은 n번 그룹이 존재할 때 일치해야 하는 표현식입니다.

예를 들면 아래와 같습니다.

(\()?\d+(\.\d+)?(?(1)\))

12345
12.3456
(120.293)
(18729.28 // 숫자만
2839283   // 숫자만

위의 정규식을 분석해봅시다.

  • \을 쓴다는 것은 메타 문자를 문자 자체로 변환시키기 위함입니다. 즉 \( 은 ( 그 자체를 의미합니다.
  • \( 이 ()에 감싸져있으므로 ()안에 있는 글자를 하나의 묶음으로 본다는 의미입니다.
  • ?는 앞에 있는 글자가 있을 수도 있고, 없을 수도 있다는 의미입니다.
  • \d 는 숫자를 의미하는데 이 숫자뒤에 +가 붙었음으로 1번 이상으로 반복되는 숫자를 의미합니다.
  • (\.\d+)? 도 해석할 수 있겠죠?
  • 이제 (?(n)) 의 응용이 나옵니다. n이 1이므로 첫번째 그룹을 우리는 신경써야합니다. 이 정규식에서 첫번째 그룹은 (\() 입니다. 즉 열리는 괄호를 신경쓰겠다는 뜻입니다.
  • 열리는 괄호를 신경써서 그 그룹이 존재할 때, 열린 괄호가 존재할때 \), 닫힌 괄호가 있어야 한다는 의미입니다.

따라서 숫자, 숫자.숫자, (숫자), (숫자.숫자) 는 선택되지만 괄호가 제대로 닫히지 않은 것들은 선택되지 않습니다.

⚠️ **GitHub.com Fallback** ⚠️