Regex, 정규식을 쓰자! - Tirrilee/TechTalk GitHub Wiki
정규식은 일반적으로 /으로 감싸진 형태로 이루어집니다.
. : 모든 문자와 일치합니다.
[] : 대괄호 사이에 존재하는 문자들 중 하나에 일치합니다.
[^] : 대괄호 사이의 가장 첫 번째 문자로 ^ 문자가 있을 때, 그 문자 이후에 존재하는 문자들을 제외한 모든 문자와 일치합니다.
[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번 이상 반복되는 문자와 일치합니다.
#정규식
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이므로 첫번째 그룹을 우리는 신경써야합니다. 이 정규식에서 첫번째 그룹은(\()입니다. 즉 열리는 괄호를 신경쓰겠다는 뜻입니다. - 열리는 괄호를 신경써서 그 그룹이 존재할 때, 열린 괄호가 존재할때
\), 닫힌 괄호가 있어야 한다는 의미입니다.
따라서 숫자, 숫자.숫자, (숫자), (숫자.숫자) 는 선택되지만 괄호가 제대로 닫히지 않은 것들은 선택되지 않습니다.