Существует два типа lookaround утверждений для регулярных выражений: предвидение и 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
возвращает соответствие, которое удовлетворяет предварительное условие, которое является именем папки iofun
.
Предварительные утверждения не используют символов в тексте. В результате можно использовать их, чтобы найти перекрывающиеся последовательности символов.
Например, используйте предвидение, чтобы найти каждую последовательность шести непробельных символов в векторе символов путем соответствия с начальными символами, которые предшествуют пяти дополнительным символам:
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
между двумя условиями. Этот пример первоначально пытается определить местоположение всех строчных согласных в символьном массиве, состоящем из первых 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'}
Попробуйте это снова, с помощью предварительного оператора, чтобы создать следующее условие 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
, необходимо поместить выражение соответствия expr
после проверяемого выражения test
:
(?=test)expr or (?!test)expr