티스토리 뷰
이전글: 배워서 남주는 정규표현식(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
- 알고리즘 풀이
- 소프트웨어장인
- 멘토에게묻다
- 안드로이드
- 세탁기설치
- 이직
- 이사
- 개발자
- 프로그래머의 길
- 알고리즘
- 프로그래머의길
- 정규식
- 디버깅
- 멘토에게 묻다
- 알고리즘풀이
- 소프트웨어 장인
- 육아
- 개발자취업
- 프로그래머스
- 정규표현식
- 스타트업
- 비전공개발자
- 건조기설치
- 건조기
- Regex
- 세탁기
- 미야자키 하야오
- software craftmanship
- 문과생개발자
- 프로그래머의길멘토에게묻다
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |