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

Предварительные утверждения

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

Предварительное утверждение имеет форму (?=test) и может появиться где угодно в регулярном выражении. MATLAB® смотрит вперед текущего местоположения в тексте для условия испытания. Если MATLAB совпадает с условием испытания, он продолжает обрабатывать остальную часть выражения, чтобы найти соответствие.

Например, смотрите вперед в векторе символа, задающем путь, чтобы найти имя папки, которая содержит программный файл (в этом случае, fileread.m m.

chr = which('fileread')
chr =
   matlabroot\toolbox\matlab\iofun\fileread.m
regexp(chr,'\w+(?=\\\w+\.[mp])','match')
ans = 
    '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

Другой способ использовать предварительную операцию состоит в том, чтобы выполнить логический 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 = 
  Columns 1 through 14

    ' '    'N'    'O'    'R'    'M'    'E'    'S'    'T'    ' '    
        'E'    's'    't'    'm'    't'
  ...

Попробуйте это снова, с помощью предварительного оператора, чтобы создать следующее условие AND:

(lowercase letter) AND (not a vowel)

На этот раз результат правилен:

c = regexp(chr,'(?=[a-z])[^aeiou]','match')
c = 
  's'  't'  'm '  't'  't'  'h'  'm'  't'  'r'  'x'
     'n'  'r'  'm'

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

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

Смотрите также

| |

Похожие темы

Была ли эта тема полезной?