Определения Lookahead в регулярных выражениях

Требования к интерполяционной головке

Существует два типа интерполяционных утверждений для регулярных выражений: lookahead и lookbehind. В обоих случаях утверждение является условием, которое должно быть удовлетворено, чтобы вернуть соответствие выражению.

Утверждение lookahead имеет форму (?=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]). The regexp функция возвращает соответствие, которое удовлетворяет условию lookahead, которое является именем папки iofun.

Перекрывающиеся совпадения

Значения lookahead не потребляют никаких символов в тексте. В результате можно использовать их, чтобы найти перекрывающиеся последовательности символов.

Для примера используйте lookahead, чтобы найти каждую последовательность из шести нежестких символов в векторе символов путем подбора начальных символов, которые предшествуют пяти дополнительным символам:

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

Без оператора lookahead MATLAB анализирует вектор символов слева направо, потребляя вектор как он идет. Если найдены соответствующие символы, regexp записывает местоположение и возобновляет анализ вектора символов из местоположения последнего совпадения. В этом процессе нет перекрытия символов.

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

     1     8    16    24

Стартовые индексы соответствуют следующим фразам:

Locate   severa   6-char   phrase

Логические И Условия

Другой способ использования операции lookahead - это выполнение логического AND между двумя условиями. Этот пример первоначально пытается найти все строчные согласные в символьном массиве, состоящем из первых 50 символов справки для normest функция:

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'}

Повторите попытку с помощью оператора lookahead для создания следующего 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'}

Обратите внимание, что при использовании оператора lookahead для выполнения ANDнеобходимо поместить выражение соответствия expr после тестового выражения test:

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

См. также

| |

Похожие темы