Существует два типа утверждений поиска для регулярных выражений: 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