Dr web регулярные выражения
Dr.Web для почтовых серверов Unix
Системные требования
- Linux (ядро 2.4 или выше), FreeBSD версий 6.x, 7.x, 8.x, Solaris 10 (только для платформы Intel).
- CommuniGate Pro, Courier MTA, Exim, Postfix, QMail, Sendmail, ZMailer.
Соответствие требованиям российского законодательства
Возможность гибкой настройки под потребности пользователей
Нетребовательность к квалификации администратора
Несмотря на богатство функциональных возможностей, Dr.Web для почтовых серверов Unix не требует длительной настройки перед введением в строй. Кроме того, он поставляется не только в виде программного продукта, но и в составе программно-аппаратного комплекса Dr.Web Office Shield – сервера, спроектированного для работы по принципу «поставил и забыл».
Нетребовательность к системе
Dr.Web для почтовых серверов Unix отличается низкими системными требованиями, что позволяет ему идеально функционировать на почтовых серверах практически любой конфигурации. Это особенно актуально для тех предприятий, которые не имеют возможности постоянно обновлять свои серверы под растущие системные требования большинства антивирусных продуктов.
Минимальная совокупная стоимость
В отличие от многих конкурирующих решений, Dr.Web для почтовых серверов Unix имеет максимально гибкую и мультивариантную систему лицензирования. Клиент приобретает только те компоненты защиты, которые ему нужны, и не переплачивает за ненужные ему элементы или даже целые решения, которые он никогда не будет использовать.
Отличная масштабируемость
Dr.Web для почтовых серверов Unix способен удовлетворить запросы как небольшой компании с одним почтовым сервером, так и безграничные потребности по сканированию почтового трафика транснационального поставщика телематических услуг. Это стало возможно благодаря способности продукта обрабатывать гигантские массивы информации в режиме реального времени, надежности его работы и гибкости настроек.
Возможность динамического распределения нагрузки позволяет оптимизировать загрузку сервера без необходимости проведения серии ручных тестов. Использование интерфейса тестирования настроек и контроля за состоянием сервисов позволяет вносить изменения в их правила работы практически «на лету», что значительно упрощает сопровождение системы и снижает сроки введения ее в строй.
Настройки сервисов фильтрации и базы карантина могут храниться в хранилищах самого различного типа – от простых файлов до баз данных типа Oracle. Использование для хранения настроек сервисов, поддерживающих протоколы LDAP, значительно упрощает их администрирование благодаря возможности интеграции в структуру корпоративной службы каталогов.
Высокая скорость отклика
Антиспам Dr.Web поставляется в составе единого решения (а не в виде отдельного продукта ) и устанавливается на одном сервере с продуктом для фильтрации вирусов. Это упрощает администрирование комплексной защиты и обеспечивает более низкую совокупную стоимость, чем при покупке решений конкурентов.
Dr.Web для почтовых серверов Unix использует для своей работы уникальные технологии фильтрации спама, которые позволяют полностью отказаться от черных списков, что делает невозможным компрометацию компаний через злонамеренное внесение их в такие списки.
Dr.Web для почтовых серверов Unix может изменять свое поведение в зависимости от конверта обрабатываемого письма или обнаруженных блокирующих объектов.
Дополнительные преимущества антиспама Dr.Web:
Повышенная безопасность корпоративной почты
- существенно повышает общую безопасность сети;
- значительно улучшает качество фильтрации за счет отсутствия ограничений, накладываемых почтовыми серверами;
- снижает нагрузки на внутренние почтовые серверы и рабочие станции;
- повышает стабильность работы системы проверки почты в целом
Защита конфиденциальной информации
Гарантированная доставка почты
Даже если пользователь длительное время недоступен и не может получать письма, они не удаляются, а сохраняются в специальном каталоге и в любой момент доступны адресату. Это позволяет упростить настройки почтового сервера и избавиться от приобретения для этих целей специальных продуктов.
Удобство администрирования
Возможность использования веб-интерфейса для настройки и управления продуктом позволяет с легкостью осуществлять администрирование защиты из любой точки мира.
Открытость
Dr.Web для почтовых серверов Unix может интегрироваться в решения других производителей. Кроме того, благодаря открытому API в него можно добавить новые функциональные возможности.
Возможность подключения неограниченного количества плагинов
Dr.Web для почтовых серверов Unix позволяет неограниченно наращивать функциональность, причем любой разработанный плагин работает сразу со всеми поддерживаемыми MTA.
И это далеко не все преимущества Dr.Web для почтовых серверов Unix! Изучить все сильные стороны этого продукта можно с помощью сервиса онлайн-тестирования Dr.Web LiveDemo.
Описание
Dr.Web для почтовых серверов Unix обладает встроенной возможностью балансировки нагрузки между серверами и способностью обрабатывать гигантские массивы информации в режиме реального времени. Благодаря этому, а также с учетом надежности работы и гибкости настроек продукт способен удовлетворить запросы как небольшой компании с одним почтовым сервером, так и безграничные потребности по сканированию почтового трафика транснационального поставщика телематических услуг.
Технология динамического распределения нагрузки позволяет эффективно использовать ресурсы каждого сервера без необходимости проведения серии ручных тестов.
Интерфейс тестирования настроек и контроля состояния сервисов позволяет вносить изменения практически «на лету», что значительно упрощает сопровождение системы и ускоряет сроки введения ее в строй
Настройки сервисов фильтрации и базы карантина могут помещаться в хранилища различного типа – от простых файлов до баз данных типа Oracle.
Для хранения настроек используются службы каталогов LDAP. Это значительно упрощает администрирование системы фильтрации благодаря возможности интеграции в структуру корпоративной службы каталогов.
Компоненты
Сразу после получения письма обрабатываются плагинами из очереди BeforeQueueFilters, после чего, если очередь AfterQueueFilters пуста, результаты обработки письма возвращаются компоненту Receiver. Если же в очереди AfterQueueFilters указаны какие-либо плагины, то письмо, после обработки плагинами из очереди BeforeQueueFilters поступает в базу данных, а затем отправляется во внутреннюю очередь модуля drweb-maild, при этом компоненту Receiver возвращается код успешной проверки письма. Затем письмо проверяется плагинами из очереди AfterQueueFilters.
Результаты проверки отправляются либо компоненту Receiver (если существует такая возможность, например, еще не истек таймаут на ожидание результата проверки), либо компоненту Sender. Через компонент Sender также отправляются все письма сгенерированные плагинами. Некоторым плагинам для работы необходима поддержка базы данных, такие плагины не могут быть помещены в очередь BeforeQueueFilters.
Компонент отвечает за отправление писем либо напрямую в различные почтовые системы, либо по протоколам SMTP/LMTP. В зависимости от используемых почтовых систем и протоколов, функции компонента Sender выполняют разные модули (drweb-Sender, drweb-cgp-Sender и т.д.). Компонент Sender может получать запросы на отправление писем от компонентов drweb-maild, drweb-notifier и drweb-monitor.
Обеспечивает возможность работы системы обработки почты как в автономном режиме, так и в режиме интеграции с Центром управления Dr.Web. Все компоненты системы (кроме drweb-monitor) получают свои конфигурационные данные через модуль drweb-agent, поэтому он должен запускаться перед другими компонентами. Так же, модуль drweb-agent отвечает за проверку лицензии и сбор статистической информации о работе компонентов системы: имена найденных блокируемых объектов, общий объем проверенной информации и т.д.
Вспомогательный компонент, запускающий и останавливающий модули системы в заданном порядке, а также контролирующий их работу. В случае сбоя в работе какого-либо модуля системы, drweb-monitor осуществляет его перезапуск, а также, (если это задано настройками) уведомление об этом администратора системы.
Плагины
На текущий момент в Dr.Web для почтовых серверов Unix реализованы следующие плагины:
Стабильность работы
Модульная структура системы в целом, а также специальный модуль, ответственный за работоспособность, обеспечивают бесперебойное функционирование плагина. Вывести его из строя практически невозможно.
Высокая скорость отклика
Карантин
Обнаруженные инфицированные и подозрительные файлы могут перемещаться в карантин. Благодаря этому возможна дополнительная обработка этих файлов, в том числе извлечение необходимой информации, лечение или удаление.
Удобство управления
Конфигурационные файлы позволяют гибко настроить параметры работы плагина в удобном для пользователя режиме. Любые действия плагина отражаются в журналах системы, что позволяет анализировать ее поведение и выявлять узкие места. Удобная система оповещения администратора позволяет максимально быстро предпринимать необходимые действия.
Открытость
Благодаря открытой архитектуре системы MailD пользователь может самостоятельно реализовать дополнительный функционал, использующий возможности плагина, с помощью открытого SDK и подробной документации по работе с ним.
Удобство использования
Удобство управления
Используя регулярные выражения, пользователь может настроить параметры фильтрации полностью под свои потребности. Удобная система оповещения администратора безопасности позволяет максимально быстро предпринимать необходимые действия.
Открытость
Благодаря открытой архитектуре системы MailD пользователь может самостоятельно реализовать дополнительный функционал, использующий возможности плагина, с помощью открытого SDK и подробной документации по работе с ним.
Стабильность работы
Модульная структура системы в целом, а также специальный модуль, ответственный за работоспособность, обеспечивают бесперебойное функционирование плагина. Вывести его из строя практически невозможно.
Высокая скорость отклика
Удобство управления
Открытость
Благодаря открытой архитектуре системы MailD пользователь может самостоятельно реализовать дополнительный функционал, использующий возможности плагина, с помощью открытого SDK и подробной документации по работе с ним.
Стабильность работы
Модульная структура системы в целом, а также специальный модуль, ответственный за работоспособность, обеспечивают бесперебойное функционирование плагина. Вывести его из строя практически невозможно.
Высокая скорость отклика
Плагин vaderetro осуществляет антиспам-фильтрацию через собственную библиотеку (Vade Retro). Эта библиотека постоянно обновляется, обеспечивая непрерывное повышение качества фильтрации. Высокая продуктивность отсева почтового «мусора» сочетается с низким потреблением системных ресурсов. Поэтому антиспам Dr.Web эффективно работает и на устаревшем оборудовании.
В зависимости от результатов анализа каждому письму, обработанному библиотекой Vade Retro, дается оценка – целое число в диапазоне от -10000 до +10000. Чем выше оценка, тем больше вероятность, что письмо является спамом.
Закончив анализ письма, библиотека Vade Retro может добавить в него (в зависимости от настроек плагина) соответствующие заголовки.
Преимущества
- Значительное улучшение качества фильтрации за счет отсутствия ограничений со стороны почтового сервера.
- Снижение нагрузки на внутренние почтовые серверы, серверы контентной фильтрации, почтовые и интернет-шлюзы, а также рабочие станции.
- Повышение стабильности проверки почты и безопасности сети в целом.
- Защита от атак спамеров
Администратор может ограничивать параметры SMTP-сессии, тем самым исключая вероятность спамерской атаки.
Благодаря функции проверки подлинности IP-адреса компания защищена от спама, скрытого под недостоверным IP отправителя.
Продукт позволяет эффективно противостоять как пассивным атакам (типа PLAIN, LOGIN и т.д.), так и активным атакам без перебора по словарю.
Dr.Web SMTP proxy позволяет проводить проверку получателя на спам-ловушку.
Продукт блокирует письма с пустыми полями отправителя, но в то же время корректно обрабатывает неверно составленные письма от почтовых клиентов.
Использование Dr.Web SMTP proxy позволяет ограничить размер отправляемых по электронной почте вложений.
Если нужно организовать такой сервер, с помощью Dr.Web SMTP proxy администратор может ограничить список доменов, на которые разрешена пересылка писем.
Всегда актуальный
- Процесс обновления происходит незаметно для пользователя — при подключении к сети Интернет, по запросу или по расписанию.
- Загрузка осуществляется быстро (даже на медленных модемных соединениях).
- Всегда имеются доступные серверы обновлений.
- По завершении обновления в большинстве случаев не требуется перезагружать компьютер: Dr.Web сразу готов к работе с использованием самых свежих вирусных баз.
- Обновления отличаются небольшими размерами — в пределах 50–200 КБ.
- Для экономии трафика можно настроить прием только обновлений вирусных баз. Включать эту опцию не рекомендуется. Dr.Web с целью противодействия новым киберугрозам постоянно совершенствуется. Новые возможности включаются в обновленные модули антивирусного пакета и автоматически загружаются с серверов компании при очередном обновлении.
- Скачивать обновления можно в виде заархивированных файлов — тем самым трафик экономится. Для уменьшения размеров скачиваемых обновлений компания «Доктор Веб» использует специальный алгоритм сжатия передаваемых данных. При незначительном исправлении или дополнении в вирусных базах или модулях программы применяются файлы-патчи, что сокращает объем передаваемых данных в десятки раз.
Служба вирусного мониторинга
- Служба вирусного мониторинга компании «Доктор Веб» собирает по всему миру образцы вредоносных объектов, изготавливает к ним противоядия и выпускает «горячие» обновления по мере анализа новой угрозы — до нескольких раз в час.
- С момента выпуска такие обновления сразу становятся доступными для всех пользователей Dr.Web с нескольких серверов обновления в разных точках земного шара.
- С целью избежать ложных срабатываний обновления перед выпуском тестируются на огромном массиве чистых файлов.
- Интеллектуальная система автоматизированного добавления родственных вирусов позволяет максимально оперативно нейтрализовать вирусные атаки.
Виды лицензий
- По числу защищаемых пользователей.
- Посерверная лицензия – для проверки неограниченного объема корреспонденции на одном сервере, с числом защищаемых пользователей не более 3 000.
Программный продукт Dr.Web для почтовых серверов Unix можно приобрести отдельно или в составе комплекса Dr.Web Enterprise Security Suite. В последнем случае дополнительно лицензируются Центр управления Dr.Web Enterprise Security Suite и Антиспам.
Кроме того, в качестве дополнительного компонента Dr.Web для почтовых серверов Unix может выступать SMTP proxy. Совместное использование обоих продуктов не только существенно повышает общую безопасность сети, но и снижает нагрузку на внутренние почтовые серверы и рабочие станции.
Варианты лицензий
- Антивирус
- Антивирус + Центр управления
- Антивирус + SMTP proxy
- Антивирус + Центр управления + SMTP proxy
- Антивирус + Антиспам
- Антивирус + Антиспам + Центр управления
- Антивирус + Антиспам + SMTP proxy
- Антивирус + Антиспам + Центр управления + SMTP proxy
Также Dr.Web для почтовых серверов Unix доступен в составе экономичных Комплектов Dr.Web для малого и среднего бизнеса.
К1. Опции регулярных выражений PCRE
Регулярные выражения применяются как в конфигурационном файле Сервера Dr.Web, так и в Центре управления при задании исключаемых из сканирования объектов в настройках Сканера Dr.Web.
Регулярные выражения записываются в следующей форме:
где EXP — собственно выражение, options — последовательность опций (строка букв), qr<> — литеральные метасимволы. В целом конструкция выглядит, например, так:
qri — файл подкачки ОС Windows NT
• Опция 'a' , соответствующая PCRE_ANCHORED
С этой настройкой шаблон принудительно "встает на якорь", т. е. ограничивается сопоставлением только с первой искомой позицией в строке, по которой осуществляется поиск ("строка темы"). Это также можно достигнуть с помощью соответствующих конструкций в самом шаблоне.
• Опция 'i' , соответствующая PCRE_CASELESS
С этой настройкой буквы в шаблоне сопоставляются как с заглавными, так и со строчными буквами. Данная возможность может быть изменена в шаблоне настройкой опции (?i) .
• Опция 'x' , соответствующая PCRE_EXTENDED
• Опция 'm' , соответствующая PCRE_MULTILINE
По умолчанию, PCRE считает, что строка темы состоит из единственной строки с символами (даже если она на самом деле содержит символы перевода строк). Метасимвол "начала строки" "^" сопоставляется только в начале строки, в то время как метасимвол "конец строки" "$" сопоставляется только в конце строки или перед заключительным переводом строки (если не установлена опция PCRE_DOLLAR_ENDONLY ).
Если установлена опция PCRE_MULTILINE , метасимволы "начало строки" и "конец строки" привязываются к следующим сразу за ними или перед ними любым переводам строки в строке темы, а также в самом начале и конце строки. Данную опцию можно изменить в шаблоне настройкой опции (?m) . Если в тексте нет символов "\n" или если в шаблоне не встречается ^ или $ , опция PCRE_MULTILINE не имеет смысла.
• Опция 'u' , соответствующая PCRE_UNGREEDY
Эта опция отменяет "жадность" квантификаторов, так что они становятся "нежадными" по умолчанию, но восстанавливают "жадность", если за ними следует "?" . Это также можно настроить опцией (?U) в шаблоне.
• Опция 'd' , соответствующая PCRE_DOTALL
С этой настройкой метасимвол точки в шаблоне сопоставляется со всеми символами, включая символ новой строки. Без него символы новой строки исключаются. Эту опцию можно изменить в шаблоне установкой новой опции (?s). Отрицательный класс, например, [ ^a ], всегда сопоставляется с символом новой строки, независимо от установок этой опции.
• Опция 'e' , соответствующая PCRE_DOLLAR_ENDONLY
С этой настройкой символ доллара в шаблоне сопоставляется только в конце строки темы. Без этой опции доллар также сопоставляется в положении непосредственно перед символом перевода строки в конце строки (но не перед любыми другими символами новой строки). Опция PCRE_DOLLAR_ENDONLY игнорируется, если установлена опция PCRE_MULTILINE .
В разделе Исключения задается список каталогов и файлов, исключаемых из антивирусной проверки.
Для редактирования списков исключаемых путей и файлов:
1. Введите путь к требуемому файлу или каталогу в строку Исключаемые пути и файлы .
2. Для того чтобы добавить новую строку в список, нажмите кнопку и в открывшуюся строку введите требуемый путь.
3. Для того чтобы удалить элемент из списка, нажмите кнопку напротив соответствующей строки.
Список исключаемых объектов может содержать элементы следующих видов:
1. Прямой путь в явном виде до исключаемого объекта. При этом:
• Символ \ или / – исключение из проверки всего диска, на котором находится каталог установки ОС Windows,
• Путь, заканчивающийся символом \ – данный каталог исключается из проверки,
• Путь, не заканчивающийся символом \ – любой подкаталог, путь к которому начинается на указанную строку, исключается из проверки.
Например : C:\Windows – не проверять файлы каталога C:\Windows и все его подкаталоги.
2. Маски объектов, исключаемых из проверки. Для задания масок допускается использование знаков ? и * .
Например : C:\Windows\*\*.dll – не проверять все файлы с расширением dll , расположенные во всех подкаталогах каталога C:\Windows .
3. Регулярное выражение. Пути могут задаваться регулярными выражениями. Также любой файл, полное имя которого (с путем) соответствует регулярному выражению, исключается из проверки.
Синтаксис регулярных выражений, используемых для записи исключаемых путей, следующий:
Наиболее часто в качества флага используется символ i , данный флаг означает "не принимать во внимание различие регистра букв".
Примеры записи исключаемых путей и файлов при помощи регулярных выражений
не проверять файлы подкачки ОС Windows NT
не проверять файлы notepad.exe
не проверять вообще ничего на диске C
не проверять ничего в каталогах WINNT на всех дисках
объединение двух предыдущих случаев
не проверять файл c:\dir1\dir2\file.ext
не проверять файл file.ext , если он в каталоге c:\dir1\dir2 и его подкаталогах
не проверять каталог c:\dir1\dir2 и его подкаталоги
не проверять подкаталог dir , находящийся в любом каталоге, но проверять подкаталоги
не проверять подкаталог dir , находящийся в любом каталоге, и его подкаталоги
Использование регулярных выражений кратко описано в документе Приложения , в разделе Приложение J. Использование регулярных выражений в Dr.Web Enterprise Security Suite .
В подразделе Проверять содержимое следующих файлов вы можете отключить проверку составных объектов. Для этого снимите следующие флаги:
• Флаг Архивы предписывает Сканеру искать вирусы в файлах, упакованных в файловые архивы.
• Флаг Почтовые файлы предписывает проверять почтовые ящики.
• Флаг Инсталляционные пакеты предписывает Сканеру проверять пакеты для установки программ.
Меня зовут Виталий Котов и я немного знаю о регулярных выражениях. Под катом я расскажу основы работы с ними. На эту тему написано много теоретических статей. В этой статье я решил сделать упор на количество примеров. Мне кажется, что это лучший способ показать возможности этого инструмента.
Некоторые из них для наглядности будут показаны на примере языков программирования PHP или JavaScript, но в целом они работают независимо от ЯП.
Из названия понятно, что статья ориентирована на самый начальный уровень — тех, кто еще ни разу не использовал регулярные выражения в своих программах или делал это без должного понимания.
В конце статьи я в двух словах расскажу, какие задачи нельзя решить регулярными выражениями и какие инструменты для этого стоит использовать.
Заключение
Я постарался довольно подробно рассказать об азах мира регулярных выражений. Конечно невозможно в одну статью уместить все. Дальнейшая работа с ними — вопрос опыта и умения гуглить.
Мы активно ищем свежую литературу на тему регулярных выражений для начинающих. Причем в данном случае нас бы скорее привлекла не переводная, а исходно русскоязычная книга, которая каким-то образом затрагивала бы и регулярные выражения при обработке естественного языка. Хотим предложить вашему вниманию следующий текст — во-первых, напомнить об этой теме, во-вторых, продемонстрировать примерный уровень сложности, который нас интересует
Рано или поздно вам придется иметь дело с регулярными выражениями. Притом, какой у них сложный синтаксис, путаная документация и жесткая кривая обучения, большинство разработчиков удовлетворяются следующим: копипастят выражение со StackOverflow и надеются, что оно будет работать. Но что если бы в самом деле могли расшифровывать регулярные выражения и пользоваться ими на всю катушку? В этой статье я расскажу, почему следует еще раз присмотреться к регулярным выражениям, и как они могут пригодиться на практике.
Зачем нужны регулярные выражения?
Зачем вообще возиться с регулярными выражениями? Чем они могут помочь именно вам?
- Сравнение с шаблоном: Регулярные выражения отлично помогают определять, соответствует ли строка тому или иному формату – например, телефонному номеру, адресу электронной почты или номеру кредитной карты.
- Замена: При помощи регулярных выражений легко находить и заменять шаблоны в строке. Так, выражение text.replace(/\s+/g, " ") заменяет все пробелы в text, например, " \n\t " , одним пробелом.
- Извлечение: При помощи регулярных выражений легко извлекать из шаблона фрагменты информации. Например, name.matches(/^(Mr|Ms|Mrs|Dr)\.?\s/i)[1] извлекает из строки обращение к человеку, например, "Mr" из "Mr. Schropp" .
- Портируемость: Почти в любом распространенном языке программирования есть своя библиотека регулярных выражений. Синтаксис в основном стандартизирован, поэтому вам не придется переучиваться регулярным выражениям при переходе на новый язык.
- Код: Когда пишете код, можно пользоваться регулярными выражениями для поиска информации в файлах; так, в Atom для этого предусмотрен find and replace, а в командной строке — ack.
- Четкость и лаконичность: Если вы с регулярными выражениями на «ты», то сможете выполнять весьма нетривиальные операции, написав минимальный объем кода.
Как писать регулярные выражения
Регулярные выражения проще всего изучить на примере. Допустим, вы пишете веб-страницу, на которой будет поле для ввода телефонного номера. Поскольку вы — ас веб-разработки, вам хочется дополнительно отображать на экране галочку, если телефонный номер валиден, и крестик X — если нет.
Теперь, если человек введет или вставит в поле валидный номер, то отобразится галочка. Если пользователь уберет курсор из поля ввода, а в поле при этом останется недопустимое значение, то отобразится крестик.
Поскольку вы знаете, что телефонные номера состоят из десяти цифр, первым делом проверяете, чтобы isPhoneNumber выглядел так:
В этой функции между символами / содержится регулярное выражение с десятью \d' , то есть, символами-цифрами. Метод test возвращает true , если регулярное выражение соответствует строке, в противном случае – false . Если выполнить isPhoneNumber("5558675309") , метод вернет true ! Ура!
Однако, писать десять \d – слегка муторная работа. К счастью, то же самое можно сделать и при помощи фигурных скобок.
Иногда, вводя телефонный номер, человек начинает с ведущей 1. Правда было бы неплохо, если бы ваше регулярное выражение обрабатывало и такие случаи? Это можно сделать при помощи символа?.
Символ ? означает «ноль или единица», поэтому теперь isPhoneNumber возвращает true как для «5558675309», так и для «15558675309»!
Пока isPhoneNumber вполне хороша, но мы упускаем одну ключевую деталь: регулярные выражения сплошь и рядом могут совпадать не со строкой, а с частью строки. Оказывается, isPhoneNumber("555555555555555555") возвращает true, поскольку в этой строке десять цифр. Проблему можно решить, воспользовавшись якорями ^ и $.
Грубо говоря, ^ соответствует началу строки, а $ — концу строки, поэтому теперь ваше регулярное выражение совпадет с целым телефонным номером.
Серьезный пример
Релиз страницы состоялся, она пользуется бешеным успехом, но есть существенная проблема. В США телефонный номер можно записать разными способами:
- (234) 567-8901
- 234-567-8901
- 234.567.8901
- 234/567-8901
- 234 567 8901
- +1 (234) 567-8901
- 1-234-567-8901
Хотя пользователи и могут обойтись без пунктуации, им было бы гораздо проще вводить заранее отформатированный номер.
Пусть вы и могли бы написать регулярное выражение для обработки всех этих форматов, думаю, что это плохая идея. Как бы тщательно вы ни старались учесть все форматы, все равно какой-нибудь пропустите. Кроме того, в действительности вам интересны только сами данные, а не их форматирование. Итак, чем возиться со всей этой пунктуацией, не проще ли избавиться от нее?
Функция replace заменяет пустой строкой символ \D , соответствующий любым символам кроме цифр. Глобальный флаг g приказывает функции заменить на регулярное выражение все совпадения, а не только первое.
Еще более серьезный пример
Ваша страница с телефонными номерами всем нравится, в офисе вы – король кулера. Однако, такие профессионалы как вы не останавливаются на достигнутом, поэтому вы хотите сделать страницу еще лучше.
North American Numbering Plan – это стандарт по составлению телефонных номеров, используемый в США, Канаде и еще 23 странах. В этой системе есть несколько простых правил:
- Телефонный номер ((234) 567-8901) делится на три части: региональный код (234), код АТС (567) и номер абонента (8901).
- В региональном коде и коде АТС первая цифра может быть любой от 2 до 9, а вторая и третья цифры – от 0 до 9.
- В коде АТС 1 не может быть третьей цифрой, если вторая цифра – это 1.
Ваше регулярное выражение уже соответствует первому правилу, но нарушает второе и третье. Пока давайте разберемся со вторым. Новое регулярное выражение должно выглядеть примерно так:
Номер абонента прост, он состоит всего из четырех цифр
Региональный код немного сложнее. Нас интересует цифра от 2 до 9, за которой идут еще две цифры. Для этого можно использовать символьное множество! Символьное множество позволяет задать группу символов, из которых затем можно выбирать.
Отлично, но мы устанем вручную вводить все символы от 2 до 9. Сделаем код еще чище при помощи символьного диапазона.
Уже лучше! Поскольку региональный код такой же, как и код АТС, можно просто продублировать регулярное выражение, чтобы довести этот шаблон до ума.
А как сделать, чтобы не приходилось копировать и вставлять ту часть выражения, в которой содержится региональный код? Все упростится, если использовать группу! Чтобы сгруппировать символы, их нужно просто заключить в круглые скобки.
Итак, 2\d\d содержится в группе, а указывает, что эта группа должна фигурировать дважды.
Вот и все! Рассмотрим окончательный вариант функции
isPhoneNumber :
Когда лучше обходиться без регулярных выражений
Регулярные выражения – отличная штука, просто не следует решать с их помощью некоторые задачи.
Не будьте слишком строги. Нет никакого смысла проявлять чрезмерную строгость, когда пишешь регулярные выражения. В случае с телефонными номерами, даже если мы учтем все правила из документа NANP, все равно невозможно определить, реален ли данный телефонный номер. Если я заделаю номер(555) 555-5555, то он совпадет с шаблоном, но ведь такого телефонного номера не существует.
Не пишите HTML-парсер. Хотя регулярные выражения отлично подходят для парсинга каких-то простых вещей, синтаксический анализатор для целого языка из них не сделаешь. Если вы не любите заморачиваться, то вам вряд ли понравится разбирать нерегулярные языки при помощи регулярных выражений.
Не используйте их с очень сложными строками. Полное регулярное выражение для работы с электронной почтой состоит из 6 318 символов. Простое и приблизительное выглядит так: /^[^@]+@[^@]+\.[^@\.]+$/ . Общее правило таково: если у вас получается регулярное выражение длиннее одной строки кода, то, возможно, стоит поискать другое решение.
Пример использования функций
В PHP регулярное выражение — это строка, которая начинается и заканчивается символом-разделителем. Все, что находится между разделителями и есть регулярное выражение.
Создать регулярное выражение можно так:
Или более короткий вариант:
Пример самого простого регулярного выражения для поиска:
В этом примере мы просто ищем все символы “o”.
В PHP разница между preg_match и preg_match_all в том, что первая функция найдет только первый match и закончит поиск, в то время как вторая функция вернет все вхождения.
Пример кода на PHP:
Пробуем то же самое для второй функции:
В последнем случае функция вернула все вхождения, которые есть в нашем тексте.
Тот же пример на JavaScript:
Операторы [] и ()
По описанному выше можно было догадаться, что [] используется для группировки нескольких символов вместе. Так мы говорим, что нас устроит любой символ из набора.
Тут мы собрали в группу (между символами []) все латинские буквы и пробел. При помощи <> указали, что нас интересуют вхождения, где минимум 2 символа, чтобы исключить вхождения из пустых пробелов.
Аналогично мы могли бы получить все русские слова, сделав инверсию: “[^A-Za-z\s]”.
В отличие от [], символы () собирают отмеченные выражения. Их иногда называют “захватом”.
Они нужны для того, чтобы передать выбранный кусок (который, возможно, состоит из нескольких вхождений [] в результат выдачи).
Существует много решений. Пример ниже — это приближенный вариант, который просто покажет возможности регулярных выражений. На самом деле есть RFC, который определяет правильность email. И есть “регулярки” по RFC — вот примеры.
Мы выбираем все, что не пробел (потому что первая часть email может содержать любой набор символов), далее должен идти символ @, далее что угодно, кроме точки и пробела, далее точка, далее любой символ латиницы в нижнем регистре…
- мы выбираем все, что не пробел: “[^\s]+”
- мы выбираем знак @: “@”
- мы выбираем что угодно, кроме точки и пробела: “[^\s\.]+”
- мы выбираем точку: “\.” (обратный слеш нужен для экранирования метасимвола, так как знак точки описывает любой символ — см. выше)
- мы выбираем любой символ латиницы в нижнем регистре: “[a-z]+”
Получилось! Но что, если теперь нам надо по отдельности получить домен и имя по email? И как-то использовать дальше в коде? Вот тут нам поможет “захват”. Мы просто выбираем, что нам нужно, и оборачиваем знаками (), как в примере:
В массиве match нулевым элементом всегда идет полное вхождение регулярного выражения. А дальше по очереди идут “захваты”.
В PHP можно именовать “захваты”, используя следующий синтаксис:
Тогда массив матча станет ассоциативным:
Это сразу +100 к читаемости и кода, и регулярки.
Примеры из реальной жизни
Модификаторы шаблонов
Для регулярных выражений существует набор модификаторов, которые меняют работу поиска. Они обозначаются одиночной буквой латинского алфавита и ставятся в конце регулярного выражения, после закрывающего “/”.
- i — символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.
- m — по умолчанию текст обрабатывается, как однострочная символьная строка. Метасимвол начала строки '^' соответствует только началу обрабатываемого текста, в то время как метасимвол конца строки '$' соответствует концу текста. Если этот модификатор используется, метасимволы «начало строки» и «конец строки» также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после, как и в самом начале, и в самом конце строки.
О том, какие вообще бывают модификаторы, можно почитать тут.
Пример предыдущего регулярного выражения с модификатором на JavaScript:
Метасимволы в регулярных выражениях
Примеры по началу будут довольно примитивные, потому что мы знакомимся с самыми основами. Чем больше мы узнаем, тем ближе к реалиям будут примеры.
Чаще всего мы заранее не знаем, какой текст нам придется парсить. Заранее известен только примерный набор правил. Будь то пинкод в смс, email в письме и т.п.
Первый пример, нам надо получить все числа из текста:
Чтобы выбрать любое число, надо собрать все числа, указав “[0123456789]”. Более коротко можно задать вот так: “7”. Для всех цифр существует метасимвол “\d”. Он работает идентично.
Но если мы укажем регулярное выражение “/\d/”, то нам вернётся только первая цифра. Мы, конечно, можем использовать модификатор “g”, но в таком случае каждая цифра вернется отдельным элементом массива, поскольку будет считаться новым вхождением.
Для того, чтобы вывести подстроку единым вхождением, существуют символы плюс “+” и звездочка “*”. Первый указывает, что нам подойдет подстрока, где есть как минимум один подходящий под набор символ. Второй — что данный набор символов может быть, а может и не быть, и это нормально. Помимо этого мы можем указать точное значение подходящих символов вот так: “”, где N — нужное количество. Или задать “от” и “до”, указав вот так: “”.
Сейчас будет пара примеров, чтобы это уложилось в голове:
Примерно так же мы работает с буквами, не забывая, что у них бывает регистр. Вот так можно задавать буквы:
Такое выражение выберет все слова, которые есть в предложении и написаны кириллицей. Нам нужно третье слово.
Помимо букв и цифр у нас могут быть еще важные символы, такие как:
- \s — пробел
- ^ — начало строки
- $ — конец строки
- | — “или”
Если мы точно знаем, что искомое слово последнее, мы ставим “$” и результатом работы будет только тот набор символов, после которого идет конец строки.
То же самое с началом строки:
Прежде, чем знакомиться с метасимволами дальше, надо отдельно обсудить символ “^”, потому что он у нас ходит на две работы сразу (это чтобы было интереснее). В некоторых случаях он обозначает начало строки, но в некоторых — отрицание.
Это нужно для тех случаев, когда проще указать символы, которые нас не устраивают, чем те, которые устраивают.
Допустим, мы собрали набор символов, которые нам подходят: “[a-z0-9]” (нас устроит любая маленькая латинская буква или цифра). А теперь предположим, что нас устроит любой символ, кроме этого. Это будет обозначаться вот так: “[^a-z0-9]”.
Выбираем все “не пробелы”.
Итак, вот список основных метасимволов:
- \d — соответствует любой цифре; эквивалент 6
- \D — соответствует любому не числовому символу; эквивалент [^0-9]
- \s — соответствует любому символу whitespace; эквивалент [ \t\n\r\f\v]
- \S — соответствует любому не-whitespace символу; эквивалент [^ \t\n\r\f\v]
- \w — соответствует любой букве или цифре; эквивалент [a-zA-Z0-9_]
- \W — наоборот; эквивалент [^a-zA-Z0-9_]
- . — (просто точка) любой символ, кроме перевода “каретки”
Вступление
Регулярные выражения — язык поиска подстроки или подстрок в тексте. Для поиска используется паттерн (шаблон, маска), состоящий из символов и метасимволов (символы, которые обозначают не сами себя, а набор символов).
Это довольно мощный инструмент, который может пригодиться во многих случая — поиск, проверка на корректность строки и т.д. Спектр его возможностей трудно уместить в одну статью.
В PHP работа с регулярными выражениями заключается в наборе функций, из которых я чаще всего использую следующие:
Функции на match возвращают число найденных подстрок или false в случае ошибок. Функция на replace возвращает измененную строку/массив или null в случае ошибки. Результат можно привести к bool (false, если не было найдено значений и true, если было) и использовать вместе с if или assertTrue для обработки результата работы.
В JS чаще всего мне приходится использовать:
Какие задачи не решаются регулярными выражениями
На первый взгляд кажется, что регулярными выражениями можно описать и распарсить любой текст. Но, к сожалению, это не так.
Регулярные выражении — это подвид формальных языков, который в иерархии Хомского принадлежат 3-ому типу, самому простому. Об этом тут.
При помощи этого языка мы не можем, например, парсить синтаксис языков программирования с вложенной грамматикой. Или HTML код.
Парсим письмо в поисках нового пароля:
Есть письмо с HTML-кодом, надо выдернуть из него новый пароль. Текст может быть либо на английском, либо на русском:
Сначала мы говорим, что текст перед паролем может быть двух вариантов, использовав “или”.
Вариантов можно перечислять сколько угодно:
Далее у нас знак двоеточия и один пробел:
Далее знак тега b:
Мы оборачиваем его в захват, потому что именно он нам и нужен.
Далее мы пишем закрывающий тег b, проэкранировав символ “/”, так как это спецсимвол:
Все довольно просто.
Парсим URL:
В PHP есть клевая функция, которая помогает работать с урлом, разбирая его на составные части:
Давай сделаем то же самое, только регуляркой? :)
Но можно схитрить и сделать вот так:
В данном случае символ “?” означает, что “s” может есть, может нет…
Далее у нас идет “://”, но символ “/” нам придется экранировать (см. выше):
Далее у нас до знака “/” или до конца строки идет домен. Он может состоять из цифр, букв, знака подчеркивания, тире и точки:
Тут мы собрали в единую группу метасимвол “\w”, точку ”\.” и тире ”-”.
Далее идет URI. Тут все просто, мы берем все до вопросительного знака или конца строки:
Теперь знак вопроса, который может быть, а может не быть:
Дальше все до конца строки, если есть:
Вся красота в итоге выглядит так (к сожалению, я не придумал, как вставить эту часть так, чтобы Habr не считал часть строки — комментарием):
Главное не моргать! :)
Получилось примерно то же самое, только своими руками.
Примеры задач:
У нас есть span, внутри которых много других span и мы не знаем сколько. Надо выбрать все, что находится внутри этого span:
Само собой, если мы парсим HTML, где есть не только этот span. :)
Суть в том, что мы не можем начать с какого-то момента “считать” символы span и /span, подразумевая, что открывающих и закрывающих символов должно быть равное количество. И “понять”, что закрывающий символ, для которого ранее не было пары — тот самый закрывающий, который обосабливает блок.
То же самое с кодом и символами <>.
В такой структуре мы не сможем при помощи только регулярного выражения отличить закрывающую фигурную скобку внутри кода от той, которая завершает начальную функцию (если код состоит не только из этой функции).
Для решение таких задач используются языки более высокого уровня.
Читайте также: