블로그에 포스팅을 너무 오랜만에 하는 것 같다..
사실 하려고 생각은 많이 했지만, 최근 이사 준비, 대출, 복학 준비, 업무 등으로 정신을 못차렸달까.. ( 사실 핑계다 )
오늘은 복학을 하게 되면서.. 수업시간에 regex에 대해서 설명해주기에, 추후에도 쓸 것 같아서 정리해보려 한다.
메타 문자
기호 | 의미 |
\ | escaping |
^ | ( 개행으로 나뉜 ) 문장의 첫 지점 |
$ | ( 개행으로 나뉜 ) 문장의 끝 지점 |
. | 임의의 한 문자에 대응 |
[ ] | 문자 택일 나열을 만드는 구분자 |
^ | 문자 택일 나열 속에서 여집합 표시 |
- | 문자 택일 나열 속에서 범위 표시 |
| | 문자열, 그룹 택일 나열을 만드는 문자 |
( ) | 그룹을 만드는 구분자 |
? | 0개 혹은 1개 |
* | 0개 이상 |
+ | 1개 이상 |
{ , } | ~개 이상 / ~개 이하 |
메타 문자 → 리터럴 문자
\
는 메타 문자 ( ex ^, $, … )를 정규 표현식 속에서 기호 자체를 표현하기 위한 방식
ex: \\, \^, \$ …메타 문자 [ ]
[ ]
안쪽에 나열된 여러 문자들 중 (대응시킬 수 있는) 딱 한 문자를 의미하는 기호- 사각 괄호 안에는 반드시 (뒤에서 소개할 딱 두 개의 메타 문자 외에는) 리터럴 문자만 들어가야 함)
예: 정규식 “[ABF]”는 문자 “A”, “B”, “F”에(만) 대응 예: 정규식 “[0123456789]”는 아무 10진법 숫자 하나에(만) 대응 예: 정규식 “[0123456789abcdefABCDEF]”는 아무 16진법 숫자 하나에(만) 대응 예: 정규식 “un[hpt]ac[kt]”는 문자열 “unhack”, “unhact”, “unpack”, “unpact”, “untack”, “untact” 에(만) 대응 예: 정규식 “Get[␣\t]off!”는 문자열 “Get␣off!”, “Get−→off!”에(만) 대응
메타 문자 [ ] 속의 메타 문자 “-” (범위)
[ ]
내부에서 두 리터럴 문자 사이에 사용된 - 문자는 범위를 뜻하는 메타 문자- 안쪽에 “f-t”라는 형태가 보일 때마다, 이것을 일단 “fghijklmnopqrst”로 치환해놓는 방식
- 순차적으로 나열할 수 있는 문자라야 함. (대체로) 문자 코드 값 기준으로 동작
- “f-t” 형태가 여러 개 등장해도 됨
- 내부 치환이 다 끝나고 나면, 치환된 [...] 중에서 한 문자 선택
예: 정규식 “[0-9]”는 아무 10진법 숫자 하나 예: 정규식 “[0-9a-fA-F]”는 아무 16진법 숫자 하나 예: 정규식 “20[01][0-9]”는 2000부터 2019까지의 정수 중 하나 리터럴문자“-”자체를선택지중하나로넣고싶을때: 대괄호속의맨처음이나맨마지막에위치 예: 정규식 “[-\+][01]”은6) 문자열 “-0”, “-1”, “+0”, “+1” 중 하나
메타 문자 [ ] 속의 메타 문자 “^" (여집합)
[ ]
내부의 제일 처음에 사용된^문자는 여집합을 뜻하는 메타 문자- 결국, 그냥 ^까지 합쳐진 “[^ ]” 자체를 여집합을 뜻하는 한 덩어리의 괄호(메타문자)로 생각해도 됨
- ‘이 속에 들어있는 문자들만 빼고, 나머지 모든 글자’라는 의미
- 메타 문자 “-” 와 동시에 사용할 수 있음: 해석 방법은 동일
정규식 “201[^3-5]”는 2013, 2014, 2015만 제외한 나머지 2010년대 연도 ...가 아님!!
- 이정규식은 “2010”, “2011” 등등 뿐만 아니라 “201a”, “201b”, 심지어 “201뷁” 에도대응됨!
- 분명히 나머지 모든 문자라고 했음: 자주 실수를 유발하는 부분이니 주의할 것!
- 그럼 이걸 어디에 쓰나요? → 뒤에 나올 ‘반복’과 합쳐서 텍스트 파일의 (예를 들어 탭 문자로 서로
구분된) 각 필드를 골라내는 일 등에 유용
아무 문자나 하나 택일: 메타 문자 .
( 개행 문자를 제외한 ) 어떤 문자든 딱 한 개의 문자에 대응
예: 정규식 “a.z”는 문자열 “aaz”, “abz”, “acz”, ..., “azz”, 심지어 “a0z”, “a뷁z” 등에도 대응 예: 정규식 “고..” 은 - 성이 고 씨고 이름이 두 글자인 사람들의 전체 이름에 대응될 뿐만 아니라 - (주의) 심지어 “고YJ”, “고␣5”, “고−→␣” 에도 대응됨 예: 정규식 “.....”은 길이가 5인 아무 문자열에나 다 대응
정해진 문장열들 중 택일: 메타 문자 |
|를 경계로 나뉜 문자열(선택지)들에 대응: 선택지 갯수는 2개 이상, 각 선택지 길이는 0 문자 이상
예: 정규식“abc|de|1234”는 문자열 “abc”, “de”, “1234” 에(만) 대응
왼쪽 끝과 오른쪽 끝 경계를 표시할 때에는 괄호를 (반드시 짝지어서) 사용
예: 정규식 “전공(필수|선택)과목”은 문자열 “전공필수과목”, “전공선택과목” 에(만) 대응
각 선택지 문자열 속에는 다시 정규 표현식 메타 문자들이 사용될 수 있음
- 예: 정규식“(197[4-9]|19[89][0-9]|20[01][0-9]|202[0-3])년” 은 1974년부터 올해까지
→ 4개의 선택지들 중 하나를 고르는 상황
- 예: 정규식“(197[4-9]|(19[89]|20[01])[0-9]|202[0-3])년”도 1974년부터 올해까지
→ 3개의 선택지들 중 하나를 고르는 상황
→ 2번째 선택지 속에 ‘2개의 선택지들 중 하나를 고르는 상황’이 들어있음
모든 선택지가 길이 1 짜리 문자열(즉, 문자 한 개)이라면 [ ]와 같은 효과
예: 정규식“201(5|6|7|8|9)년”은 정규식“201[5-9]년”과 동일
반복 횟수 표현
정규식에서 앞 그룹이 연이어 반복되는 횟수를 나타내는 특수 기호들 (단, n과 m은 자연수)
기호 | 의미 | 예시 | ㅤ |
? | 0번 혹은 1번 | ab?c | ac, abc |
* | 0번 이상 | ab*c | ac, abc, abbc, abbbc, … |
+ | 1번 이상 | ab+c | abc, abbc, abbbc, abbbbc, … |
{n} | n번 | ab{3}c | abbbc |
{n,m} | n번 이상 m번 이하 | ab{1,3}c | abc, abbc, abbbc |
{n,} | n번 이상 | ab{2,}c | abbc, abbbc, abbbbc, … |
역방향 Escaping: 리터럴 문자 → 메타 문자
평범한 리터럴 문자에 백슬래시가 붙으면 메타 문자가 되는 경우 있음
- \d 숫자 ([0-9]와 동일...이 아니고 사실은 전각 숫자 등 훨씬 많은 종류의 숫자들이 포함됨)
- \D 숫자가 아닌 문자 ([^0-9]와 동일...이 아니고 사실은 전각 숫자 등 훨씬 많은 종류의 숫자들이 제외됨)
- \s 공백들 (Perl에서는 [ \t\r\n\v\f], Vim에서는 [ \t])
- \S 공백이 아닌 문자들
- \w 알파벳, 숫자, 밑줄 ([A-Za-z0-9_]에 전각 로마자 등등 다양하게 포함)
- \W 알파벳, 숫자, 밑줄이 아닌 문자들 ([^A-Za-z0-9_] 외에도 많이 제외됨)
문장의 처음 (^)과 끝 ($)에 대한 부연
부분 문자열
을 대응한다정규 표현식 | 대응 문자열들 |
cde | cde, abcde, cdefg, abcdefg |
^cde | cde, cdefg |
cde$ | cde, abcde |
^cde$ | cde |