exponenta event banner

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

Утверждения Lookahead

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

Заглянувшее утверждение имеет вид (?=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 функция возвращает совпадение, удовлетворяющее условию 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

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

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

     1     8    16    24

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

Locate   severa   6-char   phrase

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

Другим способом использования операции поиска является выполнение логической операции 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'}

Повторите попытку, используя оператор lookhead, чтобы создать следующее 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

См. также

| |

Связанные темы