티스토리 뷰

(1) 가장 간단한 정규표현식 - 문자열

regex 패턴으로 "foo"가 주어진다면 그것은 "foo"라는 연속된 세 글자의 단어를 나타내는 패턴이 됩니다. 그럼 이것은 어떻게 매치가 될까요?  정규표현식 테스트 프로그램

(1) regex 먼저    (2) input 먼저   (3) 그룹찾기   (기타) 종료.. 1

regex: foo
input: Let's test foo pattern...
찾은 문자열  "foo" (11, 14)
input: how many foos in afooafoo?
찾은 문자열  "foo" (9, 12)
찾은 문자열  "foo" (18, 21)
찾은 문자열  "foo" (22, 25)
input: 

위의 실행 결과에서 보듯이 foo라는 regex는 입력 안에서 같은 것이 나타나는 부분에 모두 매치됩니다. 여기서 찾은 문자열은 입력 안에서 매치된 부분의 문자열과 위치(시작 글자 번호, 끝 글자번호 다음)으로 표시합니다. 왜냐하면 컴퓨터 프로그램에서는 항상 [ ... )여서 시작은 포함하는 이상, 끝은 포함하지 않는 미만입니다.

여기서 주의할 점은 다음과 같은 메타문자(특수문자)가 쌍따옴표 안에 나타나면 다른 의미를 가지게 된다는 점입니다.

<([{\^-=$!|]})?*+.>

 뒤에서 살펴보겠지만 이들은 정규표현식의 패턴 안에서 나타나는 곳이나 의미에 따라 특수한 의미로 사용됩니다.

(2) 문자 부류 (character class)

문자 부류는 여러 개의 문자 집합을 한꺼번에 표현하는 방법입니다. 쌍따옴표 문자열만으로 표현한다면 우리가 찾고자 하는 문자열의 종류만큼 패턴이 필요하게 되는데, 정규표현식을 쓰는 이유는 사실 많은 수의 문자열을 나타내는 규칙을 표현하는 것입니다. 그러므로 한개씩 한개씩 쓰는 것은 좋은 방법이 아닙니다. 문자 집합은 여러 개의 문자들 중 하나를 가진 경우를 표현하므로 좀더 강력해 집니다.

문자 집합을 표현하는데는 대괄호가 쓰입니다. 정규표현식에서 가장 많이 쓰이고 기본적인 표기법이라고 할 수 있죠. 대괄호 안에는 여러 개의 문자들이 나타날 수 있습니다.

[abc]는 세 개의 문자의 집합을 나타냅니다.

대괄호 안에서는 -와 ^ 같은 몇몇 글자는 특수한 의미로 쓰입니다. 예를 들어 -(마이너스 기호)를 이용해 [a-z]라고 쓰면 a에서 z 사이의 모든 문자(둘다 포함)의 집합을 나타냅니다.

문자 집합은 문자열의 한 글자의 역할을 합니다. 그럼 다음 패턴이 무슨 의미일까요?

[a-z][0-9][0-9]

맞습니다. 영문자 소문자 한 글자와 숫자 두개로 이루어진 문자열 부분을 나타내는 패턴이 됩니다. 

(1) regex 먼저    (2) input 먼저   (3) 그룹찾기   (기타) 종료.. 1

regex: [a-z][0-9][0-9]
input: password is 03b382x7c7899.
찾은 문자열  "b38" (14, 17)
찾은 문자열  "c78" (20, 23)
input: 

암호 부분 중에서 영문자와 숫자 두개가 연속된 경우만 매치된 것을 볼 수 있습니다. 쉽지요? 근데 이게 다는 아닙니다.

문자 부류는 regex를 쓸 때 가장 먼저 배워야 되는 개념인데 상당히 어렵습니다. [^   ]은 그 문자들을 제외한 모든 문자를 허용한다는 의미입니다. 그리고 아래에 나와 있는 것처럼 두 개의 문자 집합을 && 해서 교집합을 나타낼 수도 있습니다. 합집합은? 그냥 나열하면 합집합이 되는거죠. 

Construct Description
[abc] a, b, 또는 c (단순 클래스)
[^abc] a, b, 또는 c 이외의 모든 문자 (제외)
[a-zA-Z] a에서 z, 또는 A에서 Z까지 양쪽 포함 (범위)
[a-d[m-p]] a에서 d, 또는 m에서 p까지: [a-dm-p] (합집합)
[a-z&&[def]] d, e, 또는 f (교집합)
[a-z&&[^bc]] a에서 z, b c 제외: [ad-z] (빼기, 차집합)

위 표의 마지막 줄에 나와있는 것처럼 차집합을 표현하는 방법도 있습니다. 앞의 집합과 m-p 사이가 아닌 모든 문자들 [^m-p]의 교집합이 곧 차집합을 나타내게 되는 것이지요. [a-lq-z]와 같은 의미가 된다는 것입니다.

(3) 미리 정의된 문자 클래스 (predefined character class)

자주 쓰이는 문자 클래스를 매번 [ ... ]로 정의해서 쓰지 않아도 되도록 몇가지를 미리 정의해 둔 것이 있습니다. 

  • .(점) 모든 글자 (개행문자 포함 여부는 설정에 따라 달라질 수 있습니다)
  • \d  숫자 [0-9]
  • \D  숫자 아닌 것 [^0-9]
  • \s  공백 문자 [ \t\n\x0B\f\r]
  • \S  공백 문자 아닌 것 [^\s]
  • \w  단어 글자 [a-zA-Z_0-9]
  • \W  단어 글자 아닌 것 [^\w]

주의할 점은 이들 문자 클래스는 다 한 글자만 나타낸다는 것입니다. 그리고 위의 공백문자에서 보는 것처럼 [ ... ]안에서도 그 특수한 의미를 그대로 가지게 됩니다.

[연습문제] 다음 패턴을 만들어 regex 테스트 프로그램을 이용해서 테스트해 보세요.

  1. 영문자로 시작해서 숫자 세개를 가지는 형태의 패턴을 표시해 보세요.
  2. 년월일 여덟 글자를 표현하는 패턴을 표시해 보시오. 년도는 1000~2999까지 가능하고 월은 01~12, 일은 01~31까지 가능합니다.
  3. 핸드폰 번호를 나타내는 패턴을 표시해 보세요. 핸드폰 번호 규칙은 "010-숫자네개-숫자네개" 와 같습니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함