..

Search

33) 정규 표현식의 기초

정규 표현식의 기초


특수 문자(special characters)

정규 표현식을 사용하여 단순한 패턴을 검색하고자 할 때는 찾고자 하는 문자열을 직접 나열하면 됩니다.

하지만 숫자만을 검색하거나, 띄어쓰기를 찾는 등 정확히 일치하는 패턴보다 더 복잡한 조건을 사용하려면 특수 문자를 사용해야 합니다.

이렇게 정규 표현식에서 사용하는 특정 의미를 가지는 기호를 특수 문자 또는 메타(meta) 문자라고 합니다.

 

정규 표현식에서 사용할 수 있는 대표적인 특수 문자는 다음과 같습니다.

특수문자 설명

.

줄 바꿈 문자(\n)를 제외한 임의의 한 문자를 의미함.

?

해당 문자 패턴이 0번 또는 1번만 반복됨.

*

해당 문자 패턴이 0번 이상 반복됨.
+ 해당 문자 패턴이 1번 이상 반복됨.
{...} 반복되는 횟수를 지정함.
^ 문자열의 처음을 의미함.
$ 문자열의 끝을 의미함.
\ 특수문자를 무시함.
| 선택을 의미함. (OR)
(...) 그룹화의 시작과 끝을 의미함.

 

다음 예제는 대표적인 특수 문자를 사용한 정규 표현식으로 검색할 수 있는 문자열의 예제입니다.

예제

/.ap/         // 문자열 "ap" 앞에 임의의 한 문자가 등장하는 문자열 : aap, bap, cap, @ap, #ap, ...

/a?b/         // b 앞에 a가 0번 또는 1번 등장하는 문자열 : b, ab
/a*b/         // b 앞에 a가 0번 이상 등장하는 문자열 : b, ab, aab, aaab, ...

/a+b/         // b 앞에 a가 1번 이상 등장하는 문자열 : ab, aab, aaab, aaaab, ...
/a{2,4}b/     // b 앞에 a가 2번 이상 4번 이하 등장하는 문자열 : aab, aaab, aaaab
/a{2,}b/      // b 앞에 a가 2번 이상 등장하는 문자열 : aab, aaab, aaaab, aaaaab, ...

/^abc/        // abc로 시작하는 문자열 : abc, abcd, abcdef, ...

/abc$/        // abc로 끝나는 문자열 : abc, zabc, xyzabc, ...

/abc|def|ghi/ // abc, def 또는 ghi 중 하나의 문자열

 


양화사(quantifier)

정규 표현식에서는 특수 문자로 수량을 나타내는 다양한 양화사를 사용할 수 있습니다.

 

- '*'는 바로 앞의 문자가 0번 이상 나타날 경우를 검색합니다. ({0, }와 같음)

- '+'는 바로 앞의 문자가 1번 이상 나타날 경우를 검색합니다. ({1, }과 같음)

- '?'는 바로 앞의 문자가 0번 또는 1번만 나타날 경우를 검색합니다. ({0,1}과 같음)

- '{n,m}'은 바로 앞의 문자가 반복되는 횟수를 지정합니다.

   바로 앞의 문자가 최소 n번이상 최대 m번이하로 나타날 경우를 검색합니다. (n과 m은 반드시 양의 정수이어야만 함)

 

예제

$subject = "PHP is cooooool!";

 

// 문자 'l' 바로 앞에 문자 'o'가 0 또는 1번 나타나는 경우를 검색함.

preg_match_all('/o?l/', $subject, $match_01);

 

// 문자 'l' 바로 앞에 문자 'o'가 0번 이상 나타나는 경우를 검색함.

preg_match_all('/o*l/', $subject, $match_02);

 

// 문자 'l' 바로 앞에 문자 'o'가 1번 이상 나타나는 경우를 검색함.

preg_match_all('/o+l/', $subject, $match_03);

 

// 영문 소문자가 1번 이상 나타나는 경우를 검색함.

// 즉, 영문 소문자만으로 이루어진 부분 문자열을 검색함.

preg_match_all('/[a-z]+/', $subject, $match_04);

코딩연습 ▶

 

예제

$subject = "PHP is cooooool!";

 

// 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 최대 4번 이하로 나타나는 경우를 검색함.

preg_match_all('/o{2,4}l/', $subject, $match_01);

var_dump($match);

 

// 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 나타나는 경우를 검색함.

preg_match_all('/o{2,}l/', $subject, $match_02);

var_dump($match);

 

// 문자 'l' 바로 앞에 문자 'o'가 정확히 6번 나타나는 경우를 검색함.

preg_match_all('/o{6}l/', $subject, $match_03);

코딩연습 ▶


위치 문자

정규 표현식에서는 해당 문자열에서 패턴을 검색할 단어의 위치까지 지정할 수 있습니다.

 

- '^'는 단어의 맨 앞에 위치한 해당 패턴만을 검색합니다.

- '$'는 단어의 맨 뒤에 위치한 해당 패턴만을 검색합니다.

 

예제

$subject = "abcdef defabc";

 

// 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.

$match_01 = preg_replace('/^abc/', 'ABC',$subject);

 

// 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함.

$match_02 = preg_replace('/abc$/', 'ABC', $subject);

코딩연습 ▶

 

preg_replace() 함수는 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하여, 해당 부분을 두 번째 인수로 전달되는 문자열로 대체한 새로운 문자열을 반환합니다.

선택 문자

정규 표현식에서는 특수문자 '|'를 사용하여 여러 개의 검색 패턴을 사용할 수 있습니다.

즉, 특수문자 '|'로 구분된 정규 표현식 중 어느 하나에만 일치해도 검색됩니다.

예제

$subject = "ABCdefGHIjkl";

 

// 문자열 'abc' 또는 'def' 또는 'jkl'만을 검색함.

// 즉, 위의 세 문자열 중 어느 하나에만 일치해도 검색됨.

preg_match_all('/abc|def|jkl/', $subject, $match);

코딩연습 ▶


문자 클래스(character class)

문자 클래스(character class)란 정규 표현식에서 명시된 범위에 해당하는 한 문자만을 선택하기 위해 사용되는 문자입니다.

이러한 문자 클래스는 꺾쇠 괄호([])를 사용하여 표현합니다.

예제

/[0-3]/        // 0부터 3까지의 숫자에 해당하는 한 문자

/[a-z]/        // 영문 소문자에 해당하는 한 문자

/[0-9a-zA-Z]/  // 숫자 또는 영문 대소문자에 해당하는 한 문자

 

 

예제

$subject = "@ap";


preg_match("/.ap/", $subject, $match_01);        // "ap" 문자열 앞에 임의의 한 문자가 나타나는 경우를 검색함.
preg_match("/[a-zA-Z]ap/", $subject, $match_01)// "ap" 문자열 앞에 영문자 한 문자가 나타나는 경우를 검색함.

코딩연습 ▶

 

위의 예제에서 사용된 특수 문자 '.'는 줄 바꿈 문자를 제외한 임의의 문자 하나를 의미합니다.

이 문자를 잘 사용하면, 검색하고자 하는 문자의 범위를 더욱 제한할 수 있습니다.


POSIX 문자 클래스

앞서 살펴본 문자 클래스 이외에도 POSIX 정규 표현식에서만 사용할 수 있는 문자 클래스가 존재합니다.

 

POSIX에서만 사용할 수 있는 문자 클래스는 다음과 같습니다.

문자 클래스 설명

[:alnum:]

영문자와 숫자에 포함되는지를 확인함.

[:alpha:]

영문 대소문자에 포함되는지를 확인함.

[:lower:]

영문 소문자에 포함되는지를 확인함.
[:upper:] 영문 대문자에 포함되는지를 확인함.
[:digit:] 십진법 숫자에 포함되는지를 확인함.
[:xdigit] 16진법 숫자나 문자에 포함되는지를 확인함.
[:punct:] 구두점에 포함되는지를 확인함.
[:blank:] 탭과 띄어쓰기에 포함되는지를 확인함.
[:space:] 공백 문자에 포함되는지를 확인함.
[:cntrl:] 제어 문자에 포함되는지를 확인함.
[:print:] 출력할 수 있는 문자에 포함되는지를 확인함.
[:graph:] 띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지를 확인함.

 

위의 표와 같이 POSIX에서만 사용할 수 있는 문자 클래스는 기본적으로 꺾쇠 괄호([])를 포함하고 있습니다.

따라서 이러한 POSIX 전용 문자 클래스는 다음과 같이 꺾쇠 괄호를 두 번 사용하여 표현됩니다.

예제

/[[:alpha:]][[:digit:]]/ // 첫 번째 문자가 영문자이고, 두 번째 문자가 숫자인 길이가 2인 문자열

                         // a1, a2, ..., b1, b2, ...

 

 

예제

$subject = "Hello PHP is cool!";

 

// 첫 번째와 세 번째 문자가 영문 소문자이고, 두 번째 문자가 띄어쓰기인 경우를 검색함.

preg_match_all('/[[:lower:]][[:space:]][[:lower:]]/', $subject, $match_01);

 

// 첫 번째 문자가 영문 소문자이고, 두 번째 문자가 띄어쓰기, 세 번째 문자가 영문 대문자인 경우를 검색함.

preg_match('/[[:lower:]][[:space:]][[:upper:]]/', $subject, $match_02);

코딩연습 ▶


연습문제