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