티스토리 뷰
이전글: 배워서 남주는 정규표현식(1)
이 글에서는 바로 정규표현식의 기본 문법격인 메타문자(meta character)에 대해서만 알아보기로 한다. 지난 글에서 일부 메타 문자를 예제로 다루기는 했지만 모두 다룰 수 없어서 이곳에 따로 정리했다. 정규식 연습 및 결과 확인은 regexr.com을 사용하고 있다. 각 카테고리에 해당하는 소제목 중 상당수는 한글로 어떻게 번역되는지를 정확히 알 수 없어서 영어로 표기하였다.
1. Character Classes [기호 클래스]
기호 클래스는 특정 set에서 문자를 찾는다.
정규식(예시) | 명칭 | 매칭 조건 | 비고 |
[ABC] | character set | [ ] 안의 문자들 | 예) [a-z], [0-9], [a-c], [+_] |
[^ABC] | negated set | [ ]안에 포함되지 않은 모든 문자들 | 예) [^a-c] |
[A-Z] | range (범위) | 두 문자 사이에 속하는 모든 문자들 | 예) [a-e] -> a, b, c, d, e |
. | dot (마침표) | 줄바꿈(line break)을 제외한 모든 문자 | |
\w | word | 알파벳, 숫자, 언더스코어를 포함한 모든 문자 | [A-Za-z0-9_]와 동일, 한글은 포함하지 않음 |
\W | not word | \w와 반대 | [^A-Za-z0-9_]와 동일 è, ë 와 같이 머리에 기호를 달고 있는 알파벳이 포함됨 |
\d | digit | 숫자 | [0-9]와 동일 |
\D | not digit | \d와 반대 | [^0-9]와 동일 |
\s | whitespace | 공백 | |
\S | not whitespace | 공백이 아닌 모든 조건 |
2. Quantifiers & Alternation [수량자와 교체 구문]
Quantifier(수량자)는 앞의 문자(token)의 개수가 특정 개수와 일치해야함을 가리킨다. Quantifier는 기본적으로 탐욕적(greedy)이기 때문에 가능한 많은 문자를 찾아낸다.
Alternation(교체 구문)은 boolean OR 연산자와 동일하게 동작한다.
정규식 | 명칭 | 매칭 조건 | 비고 |
+ | plus | +기호 앞의 조건이 1개 이상 존재 | 예) b\w+ -> be, bee, beer .. |
* | start | *기호 앞의 조건이 없거나 1개 이상 존재 | 예) b\w* -> b, be, beer |
{3} | quantifier | 괄호 앞의 조건이 괄호 안 숫자에 해당하는 만큼의 반복이 존재 | 예) ab{3} -> abbb |
{min, max} | quantifier | 괄호 앞의 조건이 min~max 만큼의 반복이 존재 | 예) ab{1, 2} -> ab, abb |
{min,} | quantifier | 괄호 앞의 조건이 최소 min 만큼의 반복이 존재 | 예) ab{2,} -> abb, abbb |
? | optional | ? 기호 앞의 조건이 있거나 없음 | 예) colou?r -> color, colour |
? | lazy quantifier (게으른 수량자) |
수량자는 기본적으로 탐욕적인 반면, 게으른 수량자를 사용하면 가능한 더 적고 짧은 값을 반환한다. | 예) b\w+? -> bee, back, bac |
| | alternation (교체 구문) | | 기호 기준 좌우 기준 중 어떤 것이든 존재 | 예) b(a|e|i)d -> bad, bed, bid |
3. Anchors [앵커]
앵커는 문자열 내의 문자가 아닌 위치를 찾는다는 점에서 독특하다.
정규식 | 명칭 | 매칭 조건 | 비고 |
^ | beginning | 문자열의 시작 혹은 라인의 시작 이 기호는 문자가 아닌 위치를 매칭함 |
예) ^\w+ |
$ | end | 문자열의 끝 혹은 라인의 끝 이 기호는 문자가 아닌 위치를 매칭함 |
예) \w+$ |
\b | word boundary | 경계에 위치한 문자 문자, 비문자, 문자의 시작과 끝 사이 |
예) \w\b |
\B | not word boundary | 경계가 아닌 모든 위치 | 예) \w\B |
4. Groups & References [그룹과 참조]
그룹은 연속된 기호가 묶여있는 형태이다. 이미 찾은 캡쳐 그룹은 *역참조를 통해 참조할 수 있다.
*역참조(backreference): 패턴의 일부를 하위 표현식으로 묶으면, 첫 번째로 나타나는 부분 문자열을 찾은 뒤에 역참조를 통해 이후에 나타나는 문자열을 찾을 수 있음
정규식(예시) | 명칭 | 설명 | 비고 |
(ABC) | capturing group | 괄호 안 조건에 매칭되는 문자열을 그룹으로 묶음 Kotlin에서는 그룹에 걸린 매칭결과를 List<String>으로 접근할 수 있음 |
예) (ha)+ |
(?:ABC) | non-capturing group | 괄호 안 조건에 매칭되는 문자열을 찾지만 그룹에 포함시키지는 않음 | 예) (?:ha)+ |
\1 | backreference (역참조) | 캡쳐 그룹의 결과를 찾음 예) \1은 첫 번째 캡쳐그룹의 결과를 찾는다. |
예) (\w)a\1 -> hah * 여기서 1번째 캡쳐그룹의 결과는 h이다. |
5. Lookaround [전후방 탐색]
Lookaround는 메인 패턴의 전(lookahead)과 후(lookbehind)에 있는 그룹을 매치시키지만 결과에는 포함시키지 않는다. 아쉽게도 우리가 사용중인 regexr.com은 후방탐색은 지원하지 않고 있다. 후방탐색을 연습해보고 싶다면 regexone.com을 사용해보길 바란다.
정규식(예시) | 명칭 | 설명 | 비고 |
(?=ABC) | positive lookahead | 메인 표현식 뒤의 그룹과 일치하는 조건을 찾지만 그룹의 패턴은 결과에 포함시키지 않음 | 예) `\d(?=px) -> 2px |
(?!ABC) | negative lookahead | 메인 표현식 뒤의 그룹과 않는 조건을 찾지만 그룹의 패턴은 결과에 포함시키지 않음 | 예) `\d(?!px) -> 2pt |
(?<=ABC) | positive lookbehind | 메인 표현식 앞의 그룹과 일치하는 조건을 찾지만 그룹의 패턴은 결과에 포함시키지 않음 | 예) (?<=\d)\w+ -> 2pt |
(?<!ABC) | negative lookbehind | 메인 표현식 앞의 그룹과 일치하는 조건을 찾지만 그룹의 패턴은 결과에 포함시키지 않음 |
맺음말
위에 나열된 메타문자 외에도 추가적인 것들이 존재하지만, 그 외는 각 언어에 한정된 패턴이거나 기본적인 범위를 벗어난다고 봐도 무방할 것 같다. 위의 기본적인 메타문자들만 잘 숙지해서 조합하면 상당히 많은 패턴을 만들 수 있다.
아! 끝으로 정규식 게임처럼 연습해볼 수 있는 웹사이트가 있어서 소개하고 싶다. (아래 링크)
참고한 곳 출처
메타 문자 참조: https://regexr.com/
역참조(backreference): https://blog.hexabrain.net/204
'프로그래밍 > 배워서 남주기 시리즈' 카테고리의 다른 글
배워서 남주는 정규표현식(1) (0) | 2022.08.30 |
---|
- Total
- Today
- Yesterday
- 프로그래머의길
- 이사
- 알고리즘풀이
- 문과생개발자
- 소프트웨어 장인
- 세탁기설치
- 괄호 종류
- 프로그래머의 길
- 소프트웨어장인
- 서평
- software craftmanship
- 멘토에게묻다
- 세탁기
- 디버깅
- 알고리즘 풀이
- 정규식
- 프로그래머스
- 개발자
- 개발자취업
- 비전공개발자
- 건조기설치
- 멘토에게 묻다
- 알고리즘
- Regex
- 프로그래머의길멘토에게묻다
- 건조기
- 안드로이드
- 정규표현식
- 스타트업
- 이직
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |