Регулярные выражения

Что такое регулярное выражение?

Регулярное выражение является последовательностью символов, которая задает определенный шаблон. Вы обычно используете регулярное выражение для искомого текста для группы слов, которая совпадает с шаблоном, например, при парсинге входных данных программы или при обработке блока текста.

Вектор символов 'Joh?n\w*' является примером регулярного выражения. Это задает шаблон, который начинает с букв Jo, опционально сопровождается буквой h (обозначенный 'h?'), затем сопровождается буквой n и заканчивается любым количеством word characters, то есть, символы, которые являются алфавитными, числовыми, или подчеркивание (обозначенный '\w*'). Этот шаблон совпадает с любым следующим:

Jon, John, Jonathan, Johnny

Регулярные выражения обеспечивают уникальный способ искать объем текста для конкретного подмножества символов в рамках того текста. Вместо того, чтобы искать точное символьное соответствие, как вы сделали бы с функцией как strfind, регулярные выражения дают вам способность искать конкретный шаблон символов.

Например, несколько способов выразить метрический уровень скорости:

km/h
km/hr
km/hour
kilometers/hour
kilometers per hour

Вы могли определить местоположение любого из вышеупомянутых условий в вашем тексте путем выдачи пяти отдельных поисковых команд:

strfind(text, 'km/h');
strfind(text, 'km/hour');
% etc.

Чтобы быть более эффективными, однако, можно создать одну фразу, которая применяется ко всем этим критериям поиска:

Переведите эту фразу в регулярное выражение (чтобы быть объясненным позже в этом разделе), и вы имеете:

pattern = 'k(ilo)?m(eters)?(/|\sper\s)h(r|our)?';

Теперь найдите один или несколько условий, использующих только одну команду:

text = ['The high-speed train traveled at 250 ', ...
   'kilometers per hour alongside the automobile ', ...
   'travelling at 120 km/h.'];
regexp(text, pattern, 'match')
ans =

  1×2 cell array

    {'kilometers per hour'}    {'km/h'}

Существует четыре функции MATLAB®, которые поддерживают поиск и заменяющий символы с помощью регулярных выражений. Первые три подобны во входных значениях, которые они принимают и выходные значения, которые они возвращают. Для получения дополнительной информации щелкните по ссылкам к страницам ссылки на функцию.

ФункцияОписание
regexp

Совпадайте с регулярным выражением.

regexpi

Совпадайте с регулярным выражением, игнорируя регистр.

regexprep

Замените часть текста с помощью регулярного выражения.

regexptranslate

Переведите текст в регулярное выражение.

При вызывании любой из первых трех функций передайте текст, который будет проанализирован и регулярное выражение в первых двух входных параметрах. При вызове regexprep передайте дополнительный вход, который является выражением, которое задает шаблон для замены.

Шаги для создания выражений

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

  1. Идентифицируйте уникальные шаблоны в строке

    Это влечет за собой разбивание текста, который вы хотите искать в группы подобных типов символов. Эти типы символов могли быть серией строчных букв, знак доллара, сопровождаемый тремя числами и затем десятичной точкой, и т.д.

  2. Выразите каждый шаблон как регулярное выражение

    Используйте metacharacters и операторы, описанные в этой документации, чтобы выразить каждый сегмент вашего поискового шаблона как регулярное выражение. Затем объедините эти сегменты выражения в отдельное выражение, чтобы использовать в поиске.

  3. Вызовите соответствующую поисковую функцию

    Передайте текст, который вы хотите проанализировать к одной из поисковых функций, таких как regexp или regexpi, или к текстовой заменяющей функции, regexprep.

Пример, показанный в этом разделе, ищет записи, содержащее контактную информацию, принадлежащую группе из пяти друзей. Эта информация включает имя каждого человека, номер телефона, место жительства и адрес электронной почты. Цель состоит в том, чтобы извлечь определенную информацию из текста..

contacts = { ...
'Harry  287-625-7315  Columbus, OH  hparker@hmail.com'; ...
'Janice  529-882-1759  Fresno, CA  jan_stephens@horizon.net'; ...
'Mike  793-136-0975  Richmond, VA  sue_and_mike@hmail.net'; ...
'Nadine  648-427-9947  Tampa, FL  nadine_berry@horizon.net'; ...
'Jason  697-336-7728  Montrose, CO  jason_blake@mymail.com'};

Первая часть примера создает регулярное выражение, которое представляет формат стандартного адреса электронной почты. Используя то выражение, пример затем ищет информацию адрес электронной почты одной из группы друзей. Контактная информация для Дженис находится в строке 2 массива ячеек contacts:

contacts{2}
ans =

    'Janice  529-882-1759  Fresno, CA  jan_stephens@horizon.net'

Шаг 1 - идентифицирует уникальные шаблоны в тексте

Типичный адрес электронной почты составлен из стандартных компонентов: имя учетной записи пользователя, сопровождаемое знак, имя поставщика интернет-услуг (ISP) пользователя, точка (период) и область, которой принадлежит ISP. Таблица ниже приводит эти компоненты в левом столбце и обобщает формат каждого компонента в правом столбце.

Уникальные шаблоны адреса электронной почтыОбщее описание каждого шаблона
Запустите с имени учетной записи
 jan_stephens ...
Одна или несколько строчных букв и символов нижнего подчеркивания
Добавление
 jan_stephens@ ...
знак
Добавьте ISP
 jan_stephens@horizon ...
Одна или несколько строчных букв, никакие символы нижнего подчеркивания
Добавьте точку (период)
 jan_stephens@horizon. ...
Точка (период) символ
Закончите с областью
 jan_stephens@horizon.net
com или net

Шаг 2 - экспресс каждый шаблон как регулярное выражение

На этом шаге вы переводите общие форматы, выведенные на Шаге 1 в сегменты регулярного выражения. Вы затем добавляете эти сегменты вместе, чтобы сформировать целое выражение.

Приведенная ниже таблица показывает обобщенные описания формата каждого символьного шаблона в крайнем левом столбце. (Это было продвинуто от правого столбца таблицы на Шаге 1.) Второй столбец показывает операторы или метасимволы, которые представляют символьный шаблон.

Описание каждого сегментаШаблон
Одна или несколько строчных букв и символов нижнего подчеркивания[a-z_]+
знак@
Одна или несколько строчных букв, никакие символы нижнего подчеркивания[a-z]+
Точка (период) символ\.
com или net(com|net)

Сборка этих шаблонов в один вектор символов дает вам полное выражение:

email = '[a-z_]+@[a-z]+\.(com|net)';

Шаг 3 - вызывает соответствующую поисковую функцию

На этом шаге вы используете регулярное выражение, выведенное на Шаге 2, чтобы совпадать с адресом электронной почты для одного из друзей в группе. Используйте функцию regexp, чтобы выполнить поиск.

Вот список контактной информации, показанной ранее в этом разделе. Запись каждого человека занимает строку массива ячеек contacts:

contacts = { ...
'Harry  287-625-7315  Columbus, OH  hparker@hmail.com'; ...
'Janice  529-882-1759  Fresno, CA  jan_stephens@horizon.net'; ...
'Mike  793-136-0975  Richmond, VA  sue_and_mike@hmail.net'; ...
'Nadine  648-427-9947  Tampa, FL  nadine_berry@horizon.net'; ...
'Jason  697-336-7728  Montrose, CO  jason_blake@mymail.com'};

Это - регулярное выражение, которое представляет адрес электронной почты, как выведено на Шаге 2:

email = '[a-z_]+@[a-z]+\.(com|net)';

Вызовите функцию regexp, передающую строку 2 массива ячеек contacts и регулярного выражения email. Это возвращает адрес электронной почты для Дженис.

regexp(contacts{2}, email, 'match')
ans =

  1×1 cell array

    {'jan_stephens@horizon.net'}

MATLAB анализирует вектор символов слева направо, “используя” вектор, когда это идет. Если соответствующие символы найдены, regexp записывает местоположение и продолжает анализировать вектор символов, начиная сразу после конца нового соответствия.

Выполните тот же вызов, но на этот раз для пятого человека в списке:

regexp(contacts{5}, email, 'match')
ans =

  1×1 cell array

    {'jason_blake@mymail.com'}

Можно также искать адрес электронной почты всех в списке при помощи целого массива ячеек для входного параметра:

regexp(contacts, email, 'match');

Операторы и символы

Регулярные выражения могут содержать символы, метасимволы, операторы, лексемы и флаги, которые задают шаблоны, чтобы соответствовать, как описано в этих разделах:

Метасимволы

Метасимволы представляют буквы, обозначают буквами области значений, цифры и пробелы. Используйте их, чтобы создать обобщенный шаблон символов.

Метасимвол

Описание

Пример

.

Любой отдельный символ, включая пробел

'..ain' совпадает с последовательностями пяти последовательных символов тот конец с 'ain'.

[c1c2c3]

Любой символ содержится в квадратных скобках. Следующие символы обработаны буквально: $ | . * + ? и - если не раньше указывали на область значений.

'[rp.]ain' совпадает с 'rain' или 'pain' или '.ain'.

[^c1c2c3]

Любой символ, не содержавший в квадратных скобках. Следующие символы обработаны буквально: $ | . * + ? и - если не раньше указывали на область значений.

'[^*rp]ain' совпадает со всеми последовательностями с четырьмя буквами, которые заканчиваются в 'ain', кроме 'rain' и 'pain' и '*ain'. Например, это совпадает с 'gain', 'lain' или 'vain'.

[c 1-c2]

Любой символ в области значений c 1 через c 2

'[A-G]' совпадает с отдельным символом в области значений A через G.

\w

Любой алфавитный, числовой, или символ подчеркивания. Для английских наборов символов \w эквивалентен [a-zA-Z_0-9]

'\w*' идентифицирует слово.

\W

Любой символ, который не является алфавитным, числовым, или подчеркивание. Для английских наборов символов \W эквивалентен [^a-zA-Z_0-9]

'\W*' идентифицирует термин, который не является словом.

\s

Любой пробельный символ; эквивалентный [ \f\n\r\t\v]

'\w*n\s' распознает слова, которые заканчивают буквой n, сопровождаемый пробельным символом.

\S

Любой непробельный символ; эквивалентный [^ \f\n\r\t\v]

'\d\S' совпадает с числовой цифрой, сопровождаемой любым непробельным символом.

\d

Любая числовая цифра; эквивалентный [0-9]

'\d*' совпадает с любым количеством последовательных цифр.

\D

Любой символ нецифры; эквивалентный [^0-9]

'\w*\D\>' распознает слова, которые не заканчиваются числовой цифрой.

\oN или \o{N}

Символ восьмеричного значения N

'\o{40}' совпадает с пробелом, заданным восьмеричным 40.

\xN или \x{N}

Символ шестнадцатеричного значения N

'\x2C' совпадает с символом запятой, заданным шестнадцатеричным 2C.

Символьное представление

Оператор

Описание

\a

Предупреждение (звуковой сигнал)

\b

Клавиша Backspace

\f

Перевод формата

\n

Новая строка

\r

Возврат каретки

\t

Горизонтальная вкладка

\v

Вертикальная вкладка

\char

Любой символ с особым значением в регулярных выражениях, с которыми вы хотите совпадать буквально (например, используйте \\, чтобы совпадать с одной наклонной чертой влево),

Кванторы

Кванторы задают число раз, шаблон должен произойти в совпавшем тексте.

Квантор

Совпадает с выражением, когда оно происходит...

Пример

expr*

0 или больше раз последовательно.

'\w*' распознает слово любой длины.

expr?

0 раз или в 1 раз.

'\w*(\.m)?' распознает слова, которые опционально заканчиваются дополнительным .m.

expr+

1 или более раз последовательно.

'<img src="\w+\.gif">' совпадает с HTML-тэгом <img>, когда имя файла содержит один или несколько символов.

expr{m,n}

По крайней мере, времена m, но не больше, чем времена n последовательно.

{0,1} эквивалентен ?.

'\S{4,8}' соответствует между четырьмя и восемью непробельными символами.

expr{m,}

По крайней мере, времена m последовательно.

{0,} и {1,} эквивалентны * и +, соответственно.

'<a href="\w{1,}\.html">' совпадает с HTML-тэгом <a>, когда имя файла содержит один или несколько символов.

expr{n}

Точно времена n последовательно.

Эквивалентный {n,n}.

'\d{4}' совпадает с четырьмя последовательными цифрами.

Кванторы могут появиться в трех режимах, описанных в следующей таблице. q представляет любой из кванторов в предыдущей таблице.

Режим

Описание

Пример

expr q

Жадное выражение: совпадайте с как можно большим количеством символов.

Учитывая текст '<tr><td><p>text</p></td>', выражение '</?t.*>' совпадает со всеми символами между <tr и /td>:

'<tr><td><p>text</p></td>'

expr q?

Ленивое выражение: совпадайте с таким же небольшим количеством символов по мере необходимости.

Учитывая text'<tr><td><p>text</p></td>', выражение '</?t.*?>' заканчивает каждый матч при первом вхождении закрывающей угловой скобки (>):

'<tr>'   '<td>'   '</td>'

expr q +

Притяжательное выражение: соответствуйте как можно больше, но не повторно сканируйте фрагменты текста.

Учитывая text'<tr><td><p>text</p></td>', выражение '</?t.*+>' не возвращает соответствий, потому что закрывающая угловая скобка получена с помощью .* и не повторно сканируется.

Группировка операторов

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

Группировка оператора

Описание

Пример

(expr)

Элементы группы выражения и лексем получения.

'Joh?n\s(\w*)' получает лексему, которая содержит фамилию любого человека с именем John или Jon.

(?:expr)

Группа, но не получают лексемы.

'(?:[aeiou][^aeiou]){2}' совпадает с двумя последовательными шаблонами гласного, сопровождаемого негласным, такими как 'anon'.

Без группировки '[aeiou][^aeiou]{2}' совпадает с гласным, сопровождаемым двумя негласными.

(?>expr)

Сгруппируйтесь атомарно. Не отслеживайте в обратном порядке в группе, чтобы завершить соответствие и не получить лексемы.

'A(?>.*)Z' не совпадает с 'AtoZ', несмотря на то, что 'A(?:.*)Z' делает. Используя атомарную группу, Z получен с помощью .* и не повторно сканируется.

(expr1|expr2)

Совпадайте с выражением expr1 или выражение expr2.

Если существует соответствие с expr1, то expr2 проигнорирован.

Можно включать ?: или ?> после вводной круглой скобки, чтобы подавить лексемы или группу атомарно.

'(let|tel)\w+' распознает слова, которые запускаются с let или tel.

Привязки

Привязки в выражении совпадают с началом или концом вектора символов или слова.

Привязка

Соответствует...

Пример

^expr

Начало входного текста.

'^M\w*' распознает слово начиная с M в начале текста.

expr$

Конец входного текста.

'\w*m$' распознает слова, заканчивающиеся m в конце текста.

\<expr

Начало слова.

'\<n\w*' распознает любые слова начиная с n.

expr\>

Конец слова.

'\w*e\>' распознает любые слова, заканчивающиеся e.

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

Утверждения Lookaround ищут шаблоны, которые сразу предшествуют или следуют за намеченным соответствием, но не являются частью соответствия.

Указатель остается в текущем местоположении, и символы, которые соответствуют выражению test, не получены или отброшены. Поэтому предварительные утверждения могут совпадать с перекрывающимися группами символов.

Утверждение Lookaround

Описание

Пример

expr(?=test)

Предусмотрите для символов то соответствие test.

'\w*(?=ing)' совпадает с условиями, которые сопровождаются ing, таким как 'Fly' и 'fall' во входном тексте 'Flying, not falling.'

expr(?!test)

Смотрите вперед для символов, которые не совпадают с test.

'i(?!ng)' совпадает с экземплярами буквы i, которые не сопровождаются ng.

(?<=test)expr

Оглянитесь для символов то соответствие test.

'(?<=re)\w*' совпадает с условиями, которые следуют за 're', таким как 'new', 'use' и 'cycle' во входном тексте 'renew, reuse, recycle'

(?<!test)expr

Оглянитесь для символов, которые не совпадают с test.

'(?<!\d)(\d)(?!\d)' совпадает с одноразрядными числами (цифры, которые не предшествуют или следуют за другими цифрами).

Если вы задаете предварительное утверждение, прежде чем выражение, операция будет эквивалентна логическому AND.

Операция

Описание

Пример

(?=test)expr

Совпадайте и с test и с expr.

'(?=[a-z])[^aeiou]' совпадает с согласными.

(?!test)expr

Совпадайте с expr и не совпадайте с test.

'(?![aeiou])[a-z]' совпадает с согласными.

Для получения дополнительной информации смотрите Предварительные Утверждения в Регулярных выражениях.

Логические и условные операторы

Логические и условные операторы позволяют вам тестировать состояние данного условия, и затем использовать результат, чтобы определить который шаблон, если таковые имеются, соответствовать затем. Эти операторы поддерживают логический OR и условия if/else или if. (Для условий AND см. Утверждения Lookaround.)

Условия могут быть лексемами, lookaround утверждения или динамические выражения формы (?@cmd). Динамические выражения должны возвратить логическое или числовое значение.

Условный оператор

Описание

Пример

expr1|expr2

Совпадайте с выражением expr1 или выражение expr2.

Если существует соответствие с expr1, то expr2 проигнорирован.

'(let|tel)\w+' распознает слова, которые запускаются с let или tel.

(?(cond)expr)

Если условие, cond является true, то совпадают с expr.

'(?(?@ispc)[A-Z]:\\)' совпадает с именем дисковода, таким как C:\, когда работается система Windows®.

(?(cond)expr1|expr2)

Если условие, cond является true, то совпадают с expr1. В противном случае совпадайте с expr2.

'Mr(s?)\..*?(?(1)her|his) \w*' совпадает с текстом, который включает her, когда текст начинается с Mrs, или это включает his, когда текст начинается с Mr.

Маркерные операторы

Лексемы являются фрагментами совпадающего текста, который вы задаете путем включения части регулярного выражения в круглых скобках. Можно обратиться к лексеме ее последовательностью в тексте (порядковая лексема) или присвоить имена к лексемам для более легкого обслуживания кода и читаемого вывода.

Порядковый маркерный оператор

Описание

Пример

(expr)

Получите в лексеме символы, которые совпадают с заключенным в нихом выражение.

'Joh?n\s(\w*)' получает лексему, которая содержит фамилию любого человека с именем John или Jon.

\N

Совпадайте с N th лексема.

'<(\w+).*>.*</\1>' получает лексемы для HTML-тэгов, таких как 'title' из текста '<title>Some text</title>'.

(?(N)expr1|expr2)

Если N th лексема найден, то совпадайте с expr1. В противном случае совпадайте с expr2.

'Mr(s?)\..*?(?(1)her|his) \w*' совпадает с текстом, который включает her, когда текст начинается с Mrs, или это включает his, когда текст начинается с Mr.

Названный маркерный оператор

Описание

Пример

(?<name>expr)

Получите в именованной лексеме символы, которые совпадают с заключенным в нихом выражение.

'(?<month>\d+)-(?<day>\d+)-(?<yr>\d+)' создает названные лексемы в течение месяца, дня и года на входной дате формы mm-dd-yy.

\k<name>

Совпадайте с лексемой, упомянутой name.

'<(?<tag>\w+).*>.*</\k<tag>>' получает лексемы для HTML-тэгов, таких как 'title' из текста '<title>Some text</title>'.

(?(name)expr1|expr2)

Если именованная лексема найдена, то совпадайте с expr1. В противном случае совпадайте с expr2.

'Mr(?<sex>s?)\..*?(?(sex)her|his) \w*' совпадает с текстом, который включает her, когда текст начинается с Mrs, или это включает his, когда текст начинается с Mr.

Примечание

Если выражение вложило круглые скобки, MATLAB получает лексемы, которые соответствуют наиболее удаленному набору круглых скобок. Например, учитывая поисковый шаблон '(and(y|rew))', MATLAB создает лексему для 'andrew', но не для 'y' или 'rew'.

Для получения дополнительной информации смотрите Лексемы в Регулярных выражениях.

Динамические выражения

Динамические выражения позволяют вам выполнять команду MATLAB или регулярное выражение, чтобы определить текст, чтобы соответствовать.

Круглые скобки, которые заключают динамические выражения, не создают группу фиксации.

Оператор

Описание

Пример

(??expr)

Проанализируйте expr и включайте получившийся термин в выражении соответствия.

Когда проанализировано, expr должен соответствовать полному, действительному регулярному выражению. Динамические выражения, которые используют символ ESC наклонной черты влево (\), требуют двух наклонных черт влево: один для начального парсинга expr, и один для полного соответствия.

'^(\d+)((??\\w{$1}))' определяет сколько символов, чтобы соответствовать путем чтения цифры в начале соответствия. Динамическое выражение заключено во второй набор круглых скобок так, чтобы получившееся соответствие было получено в лексеме. Например, соответствие с '5XXXXX' получает лексемы для '5' и 'XXXXX'.

(??@cmd)

Выполните команду MATLAB, представленную cmd, и включайте выходной параметр, возвращенный командой в выражении соответствия.

'(.{2,}).?(??@fliplr($1))' находит палиндромы, которые являются по крайней мере четырьмя символами долго, такими как 'abba'.

(?@cmd)

Выполните команду MATLAB, представленную cmd, но отбросьте любой выходной параметр, который возвращает команда. (Полезный для диагностирования регулярных выражений.)

'\w*?(\w)(?@disp($1))\1\w*' распознает слова, которые включают двойные буквы (такие как pp), и промежуточные результаты отображений.

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

Заменяющий оператор

Описание

$& или $0

Фрагмент входного текста, который является в настоящее время соответствием

$`

Фрагмент входного текста, который предшествует текущему соответствию

$'

Фрагмент входного текста, который следует за текущим соответствием (используют $'', чтобы представлять $'),

$N

N th лексема

$<name>

Названная лексема

${cmd}

Выведите возвратился, когда MATLAB выполняет команду, cmd

Для получения дополнительной информации смотрите Динамические Регулярные выражения.

Комментарии

Оператор comment позволяет вам вставить комментарии в свой код, чтобы сделать его более удобным в сопровождении. Текст комментария проигнорирован MATLAB при соответствии против входного текста.

'characters'

Описание

Пример

(?#comment)

Вставьте комментарий в регулярное выражение. Текст комментария проигнорирован при соответствии с входом.

'(?# Initial digit)\<\d\w+' включает комментарий и распознает слова, которые начинаются с номера.

Поисковые флаги

Поисковые флаги изменяют поведение для соответствия с выражениями.

Флаг

Описание

(?-i)

Совпадайте с регистром (значение по умолчанию для regexp и regexprep).

(?i)

Не совпадайте с регистром (значение по умолчанию для regexpi).

(?s)

Совпадайте с точкой (.) в шаблоне с любым символом (значение по умолчанию).

(?-s)

Точка соответствия в шаблоне с любым символом, который не является символом новой строки.

(?-m)

Совпадайте с ^ и метасимволами $ вначале и концом текста (значение по умолчанию).

(?m)

Совпадайте с ^ и метасимволами $ вначале и концом строки.

(?-x)

Включайте пробелы и комментарии при соответствии (значение по умолчанию).

(?x)

Проигнорируйте пробелы и комментарии при соответствии. Используйте '\ ' и '\#', чтобы совпадать с пробелом и символами #.

Выражение, которое изменяет флаг, может появиться любой после круглых скобок, такой как

(?i)\w*

или в круглых скобках и разделенный от флага с двоеточием (:), такой как

(?i:\w*)

Последний синтаксис позволяет вам изменять поведение для части большего выражения.

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

| | |

Похожие темы