한번씩 무조건 쓰게되는 정규표현식 ( regex )  의 개념

한번씩 무조건 쓰게되는 정규표현식 ( regex ) 의 개념

Tag
Computer Science Engineering
블로그에 포스팅을 너무 오랜만에 하는 것 같다..
사실 하려고 생각은 많이 했지만, 최근 이사 준비, 대출, 복학 준비, 업무 등으로 정신을 못차렸달까.. ( 사실 핑계다 )
 
오늘은 복학을 하게 되면서.. 수업시간에 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