정규 표현식의 기초

정규 표현식의 기초

■특수 문자

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

. : 줄 바꿈 문자(

)를 제외한 임의의 한 문자를 의미한다.

? : 해당 문자 패턴이 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≤x≤m로 나타날 경우를 검색한다.)

$subject = "PHP is cooooool!"; // 문자 'l' 바로 앞에 문자 'o'가 0 또는 1번 나타나는 경우를 검색함. preg_match_all('/o?l/', $subject, $match_01); var_dump($match_01) // array(1) { [0]=> array(1) { [0]=> string(2) "ol" } } // 문자 'l' 바로 앞에 문자 'o'가 0번 이상 나타나는 경우를 검색함. preg_match_all('/o*l/', $subject, $match_02); var_dump($match_02) // array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } } // 문자 'l' 바로 앞에 문자 'o'가 1번 이상 나타나는 경우를 검색함. preg_match_all('/o+l/', $subject, $match_03); var_dump($match_03) // array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } } // 영문 소문자가 1번 이상 나타나는 경우를 검색함. // 즉, 영문 소문자만으로 이루어진 부분 문자열을 검색함. preg_match_all('/[a-z]+/', $subject, $match_04); var_dump($match_04) // array(1) { [0]=> array(2) { [0]=> string(2) "is" [1]=> string(8) "cooooool" } } // 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 최대 4번 이하로 나타나는 경우를 검색함. preg_match_all('/o{2,4}l/', $subject, $match_05); var_dump($match_05); // array(1) { [0]=> array(1) { [0]=> string(5) "ooool" } } // 문자 'l' 바로 앞에 문자 'o'가 최소 2번 이상 나타나는 경우를 검색함. preg_match_all('/o{2,}l/', $subject, $match_06); var_dump($match_06); // array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } } // 문자 'l' 바로 앞에 문자 'o'가 정확히 6번 나타나는 경우를 검색함. preg_match_all('/o{6}l/', $subject, $match_07); var_dump($match_07); // array(1) { [0]=> array(1) { [0]=> string(7) "ooooool" } }

■위치 문자

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

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

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

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

$subject = "abcdef defabc"; // 단어가 문자열 "abc"로 시작하는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함. $match_01 = preg_replace('/^abc/', 'ABC',$subject); var_dump($match_01); // string(13) "ABCdef defabc" // 단어가 문자열 "abc"로 끝나는 경우를 검색하여, 해당 부분 문자열을 'ABC'로 대체함. $match_02 = preg_replace('/abc$/', 'ABC', $subject); var_dump($match_02); // string(13) "abcdef defABC"

■선택 문자

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

$subject = "ABCdefGHIjkl"; // 문자열 'abc' 또는 'def' 또는 'jkl'만을 검색함. // 즉, 위의 세 문자열 중 어느 하나에만 일치해도 검색됨. preg_match_all('/abc|def|jkl/', $subject, $match); var_dump($match); // array(1) { [0]=> array(2) { [0]=> string(3) "def" [1]=> string(3) "jkl" } }

■문자 클래스

정규 표현식에서 명시된 범위에 해당하는 한 문자만을 선택하기 위해 사용하는 문자다.

문자 클래스는 꺾쇠 괄호([])를 사용한다.

/[0-3]/ // 0부터 3까지의 숫자에 해당하는 한 문자 /[a-z]/ // 영문 소문자에 해당하는 한 문자 /[0-9a-zA-Z]/ // 숫자 또는 영문 대소문자에 해당하는 한 문자

$subject = "@ap"; preg_match("/.ap/", $subject, $match_01); // "ap" 문자열 앞에 임의의 한 문자가 나타나는 경우를 검색함. var_dump($match_01); // array(1) { [0]=> string(3) "@ap" } preg_match("/[a-zA-Z]ap/", $subject, $match_01); // "ap" 문자열 앞에 영문자 한 문자가 나타나는 경우를 검색함. var_dump($match_01); // array(0) { }

■POSIX 문자 클래스

POSIX에서만 사용할 수 있는 문자 클래스

[:alnum:] : 영문자와 숫자에 포함되는지 확인

[:alpha:] : 영문 대소문자에 포함되는지 확인

[:lower:] : 영문 소문자에 포함되는지 확인

[:upper:] : 영문 대문자에 포함되는지 확인

[:digit:] : 십진법 숫자에 포함되는지 확인

[:xdigit:] : 16진법 숫자나 문자에 포함되는지를 확인

[:punct:] : 구두점에 포함되는지를 확인

[:blank:] : 탭과 띄어쓰기에 포함되는지를 확인

[:space:] : 공백 문자에 포함되는지를 확인

[:cntrl:] : 제어 문자에 포함되는지를 확인

[:print:] : 출력할 수 있는 문자에 포함되는지를 확인

[:graph:] : 띄어쓰기를 제외한 모든 출력할 수 있는 문자에 포함되는지를 확인

$subject = "Hello PHP is cool!"; // 첫 번째와 세 번째 문자가 영문 소문자이고, 두 번째 문자가 띄어쓰기인 경우를 검색함. preg_match_all('/[[:lower:]][[:space:]][[:lower:]]/', $subject, $match_01); var_dump($match_01); // array(1) { [0]=> array(1) { [0]=> string(3) "s c" } } // 첫 번째 문자가 영문 소문자이고, 두 번째 문자가 띄어쓰기, 세 번째 문자가 영문 대문자인 경우를 검색함. preg_match('/[[:lower:]][[:space:]][[:upper:]]/', $subject, $match_02); var_dump($match_02); // array(1) { [0]=> string(3) "o P" }

from http://woong971.tistory.com/29 by ccl(A) rewrite - 2021-10-25 14:27:03