..

Search

32) 정규 표현식의 개념

정규 표현식의 개념


정규 표현식(regular expression)이란?

정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴입니다.

이러한 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용할 수 있습니다.

 

PHP에서는 다음과 같은 두 가지의 정규 표현식을 지원합니다.

 

1. POSIX

2. PCRE(Perl-Compatible Regular Expression)

 

POSIX 정규 표현식은 배우기가 쉽고 실행 속도가 빠른 편입니다.

그에 비해 PCRE 정규 표현식은 POSIX 정규 표현식을 확장하였기에 더 강력하고 유연하게 동작합니다.

하지만 우리 수업에서는 좀 더 간단한 형식의 POSIX 표준 정규 표현식을 살펴볼 것입니다.


정규 표현식 리터럴

PHP에서 정규 표현식 리터럴은 다음 문법을 사용하여 표현합니다.

문법

/검색패턴/플래그

 

정규 표현식 리터럴은 슬래시(/) 기호로 시작하여, 슬래시(/) 기호로 끝납니다.

또한, 필요에 따라 플래그를 추가하여 기본 검색 설정을 변경할 수도 있습니다.


preg_match() 함수

preg_match() 함수는 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색합니다.

문법

preg_match($pattern, $subject [,$matches]);

 

 

첫 번째 인수로 전달받은 정규 표현식에 해당하는 패턴을 두 번째 인수로 전달받은 문자열에서 검색합니다.

이렇게 검색된 결과는 배열로 반환되며, 세 번째 인수로 반환값이 저장될 배열을 직접 전달할 수도 있습니다.

 

preg_match() 함수는 정규 표현식에 해당하는 패턴이 검색되면, 더는 검색하지 않고 검색을 중단합니다.

이 함수는 일치하는 패턴이 존재하면 1을 반환하고, 존재하지 않으면 0을 반환합니다.


단순한 패턴 검색

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

 

예를 들어, 다음과 같은 정규 표현식은 정확히 "abc"라는 문자열만이 일치할 것입니다.

예제

/abc/

 

 

다음 예제는 정규 표현식을 이용한 단순한 패턴 검색 예제입니다.

예제

$subject = "간장 공장 공장장은 강 공장장이고, 된장 공장 공장장은 장 공장장이다.";

 

if (preg_match('/공장/', $subject)) {

    echo "해당 문자열에서 '공장'을 발견했습니다.<br>";

} else {

    echo "해당 문자열에서 '공장'을 발견하지 못했습니다.<br>";

}

 

if (preg_match('/장공/', $subject)) {

    echo "해당 문자열에서 '장공'을 발견했습니다.<br>";

} else {

    echo "해당 문자열에서 '장공'을 발견하지 못했습니다.<br>";

}

코딩연습 ▶

 

위의 예제에서 첫 번째 정규 표현식은 해당 문자열이 "공장"이라는 부분 문자열을 포함하고 있으므로, 1을 반환합니다.

하지만 두 번째 정규 표현식은 해당 문자열이 "장 공"이라는 부분 문자열은 포함하고 있지만, 정확히 "장공"이라는 부분 문자열을 포함하지 않으므로, 아무것도 일치하지 않습니다.

preg_match() 메소드는 해당 문자열에서 인수로 전달받은 정규 표현식과 일치하는 부분 문자열을 찾지 못하면 0을 반환합니다.


플래그(flags)

정규 표현식 리터럴을 작성할 때 플래그를 사용하여 기본 검색 설정을 변경할 수 있습니다.

플래그(flag)

설명
i 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정함.
g 검색 패턴을 비교할 때 일치하는 모든 부분을 선택하도록 설정함.
m 검색 패턴을 비교할 때 여러 줄의 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정함.
y 대상 문자열의 현재 위치부터 비교를 시작하도록 설정함.
u 대상 문자열이 UTF-8로 인코딩된 것으로 설정함.

 

예제

$subject = "bcabcAB";

 

 

// 기본 설정으로 검색 패턴을 비교할 때 대소문자를 구분함.

preg_match_all('/AB/', $subject, $matches_01);      // "AB"

 

// 검색 패턴을 비교할 때 대소문자를 구분하지 않도록 설정함.

preg_match_all('/AB/i', $subject, $matches_02); // "ab", "AB"

코딩연습 ▶

 

preg_match_all() 함수는 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 모두 검색하여, 세 번째 인수로 전달되는 배열에 저장합니다.

연습문제