Main Content

정규 표현식의 전방 탐색 어설션(Lookahead Assertion)

전방 탐색 어설션(Lookahead Assertion)

정규 표현식에는 두 가지 유형의 전후방 탐색 어설션, 즉 전방 탐색과 후방 탐색을 사용할 수 있습니다. 두 경우 모두에서 어설션은 표현식과 일치하는 부분을 반환하기 위해 반드시 충족해야 하는 조건입니다.

전방 탐색 어설션은 (?=test) 형식이며, 정규 표현식 어느 위치에나 나타낼 수 있습니다. MATLAB®은 텍스트의 현재 위치에서 테스트 조건을 정방향으로 조회합니다. 테스트 조건과 일치하는 항목을 찾으면 MATLAB이 표현식의 나머지 부분을 계속 처리하여 일치 항목을 찾습니다.

예를 들어, 경로를 명시하는 문자형 벡터에서 전방 탐색을 수행하여 프로그램 파일(이 경우, fileread.m)을 포함하는 폴더 이름을 찾아 보겠습니다.

chr = which('fileread')
chr =

    'matlabroot\toolbox\matlab\iofun\fileread.m'
regexp(chr,'\w+(?=\\\w+\.[mp])','match')
ans =

  1×1 cell array

    {'iofun'}

일치 표현식 \w+는 하나 이상의 영숫자나 밑줄 문자를 찾습니다. 이 조건과 일치하는 용어를 찾을 때마다 regexp가 전방 탐색을 수행하여 백슬래시(두 개의 백슬래시 \\로 지정됨) 다음에 파일 이름(\w+), .m 또는 .p 확장자(\.[mp])가 오는 용어를 찾습니다. regexp 함수는 전방 탐색 조건을 충족하는 일치 항목(폴더 이름 iofun)을 반환합니다.

겹치는 일치 항목

전방 탐색 어설션은 텍스트에서 어떠한 문자도 소비하지 않습니다. 따라서, 이를 사용하여 겹치는 문자 시퀀스를 찾을 수 있습니다.

예를 들어, 전방 탐색을 사용하여 문자형 벡터에서 첫 번째 문자와 그 뒤에 오는 연속된 문자 5개를 일치시킴으로써, 공백 없이 연속된 문자 6개로 구성된 모든 경우를 찾을 수 있습니다.

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S(?=\S{5})')
startIndex =

     1     8     9    16    17    24    25

시작 인덱스는 다음 구와 일치합니다.

Locate   severa   everal   6-char   -char.   phrase   hrases

전방 탐색 연산자를 사용하지 않을 경우, MATLAB은 왼쪽에서 오른쪽으로 문자형 벡터를 구문 분석해 나가면서 벡터를 "소비"합니다. 일치하는 문자가 발견되면 regexp는 그 위치를 기록하고 가장 최근 일치 항목 위치에서 문자형 벡터의 구문 분석을 재개합니다. 이 과정에서는 문자가 겹치지 않습니다.

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S{6}')
startIndex =

     1     8    16    24

시작 인덱스는 다음 구와 일치합니다.

Locate   severa   6-char   phrase

논리 AND 조건

전방 탐색 연산을 사용하는 또 다른 방법은 두 조건 사이에 논리 AND를 수행하는 것입니다. 이 예제에서는 처음에 normest 함수에 대한 도움말의 첫 50개 문자로 구성된 문자형 배열에서 모든 소문자 자음을 찾으려고 시도합니다.

helptext = help('normest');
chr = helptext(1:50)
chr =

    ' NORMEST Estimate the matrix 2-norm.
         NORMEST(S'

단순하게 비모음([^aeiou])을 검색하는 경우 출력값에 대문자, 공백 문자, 문장 부호가 포함되므로 예상된 답이 반환되지 않습니다.

c = regexp(chr,'[^aeiou]','match')
c =

  1×43 cell array

  Columns 1 through 14

    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {' '}    {'E'}    {'s'}    {'t'}    {'m'}    {'t'}

  Columns 15 through 28

    {' '}    {'t'}    {'h'}    {' '}    {'m'}    {'t'}    {'r'}    {'x'}    {' '}    {'2'}    {'-'}    {'n'}    {'r'}    {'m'}

  Columns 29 through 42

    {'.'}    {'↵'}    {' '}    {' '}    {' '}    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {'('}

  Column 43

    {'S'}

전방 탐색 연산자를 사용하여 다음과 같은 AND 조건을 생성하여 이 연산을 다시 시도하십시오.

(lowercase letter) AND (not a vowel)

이번에는 올바른 결과가 반환됩니다.

c = regexp(chr,'(?=[a-z])[^aeiou]','match')
c =

  1×13 cell array

    {'s'}    {'t'}    {'m'}    {'t'}    {'t'}    {'h'}    {'m'}    {'t'}    {'r'}    {'x'}    {'n'}    {'r'}    {'m'}

전방 탐색 연산자를 사용하여 AND를 수행하는 경우 다음과 같이 테스트 표현식 test 다음에 일치 표현식 expr을 배치해야 합니다.

(?=test)expr or (?!test)expr

참고 항목

| |

관련 항목