Эта тема описывает то, что регулярные выражения и как использовать их для искомого текста. Регулярные выражения гибки и мощны, хотя они используют комплексный синтаксис. Альтернативой регулярным выражениям является pattern
(начиная с R2020b), который более прост задать и результаты в коде, который легче считать. Для получения дополнительной информации смотрите Выражения Шаблона Сборки.
Регулярное выражение является последовательностью символов, которая задает определенный шаблон. Вы обычно используете регулярное выражение для искомого текста для группы слов, которая совпадает с шаблоном, например, при парсинге входных данных программы или при обработке блока текста.
Вектор символов '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
, передайте дополнительный вход, который является выражением, которое задает шаблон для замены.
Существует три шага, вовлеченные в использование регулярных выражений к искомому тексту для конкретного термина:
Идентифицируйте уникальные шаблоны в строке
Это влечет за собой разбивание текста, который вы хотите искать в группы подобных типов символов. Эти типы символов могли быть серией строчных букв, знак доллара, сопровождаемый тремя числами и затем десятичной точкой, и т.д.
Опишите каждый шаблон как регулярное выражение
Используйте metacharacters и операторы, описанные в этой документации, чтобы описать каждый сегмент вашего поискового шаблона как регулярное выражение. Затем объедините эти сегменты выражения в отдельное выражение, чтобы использовать в поиске.
Вызовите соответствующую поисковую функцию
Передайте текст, который вы хотите проанализировать к одной из поисковых функций, такой как 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
cellArray:
contacts{2}
ans = 'Janice 529-882-1759 Fresno, CA jan_stephens@horizon.net'
Типичный адрес электронной почты составлен из стандартных компонентов: имя учетной записи пользователя, сопровождаемое знак, имя поставщика интернет-услуг (ISP) пользователя, точка (период) и область, которой принадлежит ISP. Таблица ниже приводит эти компоненты в левом столбце и обобщает формат каждого компонента в правом столбце.
Уникальные шаблоны адреса электронной почты | Общее описание каждого шаблона |
---|---|
Начните с имени учетной записиjan_stephens . . . | Одна или несколько строчных букв и символов нижнего подчеркивания |
Добавление 'jan_stephens@ . . . | @ знак |
Добавьте ISP jan_stephens@horizon . . . | Одна или несколько строчных букв, никакие символы нижнего подчеркивания |
Добавьте точку (период)jan_stephens@horizon. . . . | Точка (период) символ |
Закончите с областьюjan_stephens@horizon.net | com или net |
На этом шаге вы переводите общие форматы, выведенные на Шаге 1 в сегменты регулярного выражения. Вы затем добавляете эти сегменты вместе, чтобы сформировать целое выражение.
Приведенная ниже таблица показывает обобщенные описания формата каждого символьного шаблона в крайнем левом столбце. (Это было продвинуто от правого столбца таблицы на Шаге 1.) Второй столбец показывает операторы или метасимволы, которые представляют символьный шаблон.
Описание каждого сегмента | Шаблон |
---|---|
Одна или несколько строчных букв и символов нижнего подчеркивания | [a-z_]+ |
@ знак | @ |
Одна или несколько строчных букв, никакие символы нижнего подчеркивания | [a-z]+ |
Точка (период) символ | \. |
com или net | (com|net) |
Сборка этих шаблонов в один вектор символов дает вам полное выражение:
email = '[a-z_]+@[a-z]+\.(com|net)';
На этом шаге вы используете регулярное выражение, выведенное на Шаге 2, чтобы совпадать с адресом электронной почты для одного из друзей в группе. Используйте regexp
функция, чтобы выполнить поиск.
Вот список контактной информации, показанной ранее в этом разделе. Запись каждого человека занимает строку contacts
cellArray:
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');
Регулярные выражения могут содержать символы, метасимволы, операторы, лексемы и флаги, которые задают шаблоны, чтобы соответствовать, как описано в этих разделах:
Метасимволы представляют буквы, обозначают буквами области значений, цифры и пробелы. Используйте их, чтобы создать обобщенный шаблон символов.
Метасимвол | Описание | Пример |
---|---|---|
| Любой отдельный символ, включая пробел |
|
| Любой символ содержится в квадратных скобках. Следующие символы обработаны буквально: |
|
| Любой символ, не содержавший в квадратных скобках. Следующие символы обработаны буквально: |
|
| Любой символ в области значений |
|
| Любой алфавитный, числовой, или символ подчеркивания. Для английских наборов символов, |
|
| Любой символ, который не является алфавитным, числовым, или подчеркивание. Для английских наборов символов, |
|
| Любой пробельный символ; эквивалентный |
|
| Любой непробельный символ; эквивалентный |
|
| Любая числовая цифра; эквивалентный |
|
| Любой символ нецифры; эквивалентный |
|
| Символ восьмеричного значения |
|
| Символ шестнадцатеричного значения |
|
Оператор | Описание |
---|---|
| Предупреждение (звуковой сигнал) |
| Клавиша Backspace |
| Перевод формата |
| Новая строка |
| Возврат каретки |
| Горизонтальная табуляция |
| Вертикальная табуляция |
| Любой символ с особым значением в регулярных выражениях, с которыми вы хотите совпадать буквально (например, используйте |
Кванторы задают число раз, шаблон должен произойти в совпавшем тексте.
Квантор | Выражение числа раз происходит | Пример |
---|---|---|
| 0 или больше раз последовательно. |
|
| 0 раз или в 1 раз. |
|
| 1 или более раз последовательно. |
|
| По крайней мере {0,1} |
|
| По крайней мере {0,} |
|
| Точно Эквивалентный |
|
Кванторы могут появиться в трех режимах, описанных в следующей таблице. q представляет любой из кванторов в предыдущей таблице.
Режим | Описание | Пример |
---|---|---|
| Жадное выражение: совпадайте с как можно большим количеством символов. | Учитывая текст
|
| Ленивое выражение: совпадайте с таким же небольшим количеством символов по мере необходимости. | Учитывая text
|
| Притяжательное выражение: соответствуйте как можно больше, но не повторно сканируйте фрагменты текста. | Учитывая text |
Группирующиеся операторы позволяют вам получать лексемы, применять один оператор к нескольким элементам или отключать отслеживание в обратном порядке в определенной группе.
Группировка оператора | Описание | Пример |
---|---|---|
| Элементы группы выражения и лексем получения. |
|
| Группа, но не получают лексемы. |
Без группировки, |
| Сгруппируйтесь атомарно. Не отслеживайте в обратном порядке в группе, чтобы завершить соответствие и не получить лексемы. |
|
| Совпадайте с выражением Если существует соответствие с Можно включать |
|
Привязки в выражении совпадают с началом или концом вектора символов или слова.
Привязка | Соответствует... | Пример |
---|---|---|
| Начало входного текста. |
|
| Конец входного текста. |
|
| Начало слова. |
|
| Конец слова. |
|
Утверждения Lookaround ищут шаблоны, которые сразу предшествуют или следуют за намеченным соответствием, но не являются частью соответствия.
Указатель остается в текущем местоположении и символах, которые соответствуют test
выражение не получено или отброшено. Поэтому предварительные утверждения могут совпадать с перекрывающимися группами символов.
Утверждение Lookaround | Описание | Пример |
---|---|---|
| Предусмотрите для символов то соответствие |
|
| Смотрите вперед для символов, которые не совпадают |
|
| Оглянитесь для символов то соответствие |
|
| Оглянитесь для символов, которые не совпадают |
|
Если вы задаете предварительное утверждение, прежде чем выражение, операция будет эквивалентна логическому AND
.
Операция | Описание | Пример |
---|---|---|
| Совпадайте с обоими |
|
| Совпадайте |
|
Для получения дополнительной информации смотрите Предварительные Утверждения в Регулярных выражениях.
Логические и условные операторы позволяют вам тестировать состояние данного условия, и затем использовать результат, чтобы определить который шаблон, если таковые имеются, соответствовать затем. Эти операторы поддерживают логический OR
и if
или if/else
условия. (Для AND
условия, см. Утверждения Lookaround.)
Условиями могут быть лексемы, lookaround утверждения или динамические выражения формы (?@cmd)
. Динамические выражения должны возвратить логическое или числовое значение.
Условный оператор | Описание | Пример |
---|---|---|
| Совпадайте с выражением Если существует соответствие с |
|
| Если условие |
|
| Если условие |
|
Лексемы являются фрагментами совпадающего текста, который вы задаете путем включения части регулярного выражения в круглых скобках. Можно обратиться к лексеме ее последовательностью в тексте (порядковая лексема) или присвоить имена к лексемам для более легкого обслуживания кода и читаемого выхода.
Порядковый маркерный оператор | Описание | Пример |
---|---|---|
| Получите в лексеме символы, которые совпадают с заключенным в нихом выражение. |
|
| Совпадайте |
|
| Если |
|
Названный маркерный оператор | Описание | Пример |
---|---|---|
| Получите в именованной лексеме символы, которые совпадают с заключенным в нихом выражение. |
|
| Совпадайте с лексемой, упомянутой |
|
| Если именованная лексема найдена, то совпадайте |
|
Примечание
Если выражение вложило круглые скобки, MATLAB получает лексемы, которые соответствуют наиболее удаленному набору круглых скобок. Например, учитывая поисковый шаблон '(and(y|rew))'
, MATLAB создает лексему для 'andrew'
но не для 'y'
или 'rew'
.
Для получения дополнительной информации смотрите Лексемы в Регулярных выражениях.
Динамические выражения позволяют вам выполнять команду MATLAB или регулярное выражение, чтобы определить текст, чтобы соответствовать.
Круглые скобки, которые заключают динамические выражения, не создают группу фиксации.
Оператор | Описание | Пример |
---|---|---|
| Проанализируйте Когда проанализировано, |
|
| Выполните команду MATLAB, представленную |
|
| Выполните команду MATLAB, представленную |
|
В рамках динамических выражений используйте следующие операторы, чтобы задать заменяющие термины.
Заменяющий оператор | Описание |
---|---|
| Фрагмент входного текста, который является в настоящее время соответствием |
| Фрагмент входного текста, который предшествует текущему соответствию |
| Фрагмент входного текста, который следует за текущим соответствием (используют |
|
|
| Названная лексема |
| Выведите возвратился, когда MATLAB выполняет команду, |
Для получения дополнительной информации смотрите Динамические Регулярные выражения.
comment
оператор позволяет вам вставить комментарии в свой код, чтобы сделать его более удобным в сопровождении. Текст комментария проигнорирован MATLAB при соответствии против входного текста.
'characters' | Описание | Пример |
---|---|---|
(?#comment) | Вставьте комментарий в регулярное выражение. Текст комментария проигнорирован при соответствии с входом. |
|
Поисковые флаги изменяют поведение для соответствия с выражениями.
Флаг | Описание |
---|---|
(?-i) | Совпадайте с регистром (значение по умолчанию для |
(?i) | Не совпадайте с регистром (значение по умолчанию для |
(?s) | Точка соответствия ( |
(?-s) | Точка соответствия в шаблоне с любым символом, который не является символом новой строки. |
(?-m) | Совпадайте |
(?m) | Совпадайте |
(?-x) | Включайте пробелы и комментарии при соответствии (значение по умолчанию). |
(?x) | Проигнорируйте пробелы и комментарии при соответствии. |
Выражение, которое изменяет флаг, может появиться любой после круглых скобок, такой как
(?i)\w*
или в круглых скобках и разделенный от флага с двоеточием (:
), такой как
(?i:\w*)
Последний синтаксис позволяет вам изменять поведение для части большего выражения.
regexp
| regexpi
| regexprep
| regexptranslate
| pattern