Что такое регулярные выражения в программировании
Перейти к содержимому

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

  • автор:

Регулярные выражения для простых смертных

Мы активно ищем свежую литературу на тему регулярных выражений для начинающих. Причем в данном случае нас бы скорее привлекла не переводная, а исходно русскоязычная книга, которая каким-то образом затрагивала бы и регулярные выражения при обработке естественного языка. Хотим предложить вашему вниманию следующий текст — во-первых, напомнить об этой теме, во-вторых, продемонстрировать примерный уровень сложности, который нас интересует

Рано или поздно вам придется иметь дело с регулярными выражениями. Притом, какой у них сложный синтаксис, путаная документация и жесткая кривая обучения, большинство разработчиков удовлетворяются следующим: копипастят выражение со 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 — если нет.

   input:not([data-validation="valid"]) ~ label.valid, input:not([data-validation="invalid"]) ~ label.invalid < display: none; >$("input").on("input blur", function(event) < if (isPhoneNumber($(this).val())) < $(this).attr(< "data-validation": "valid" >); return; > if (event.type == "blur") < $(this).attr(< "data-validation": "invalid" >); > else < $(this).removeAttr("data-validation"); >>); 

Теперь, если человек введет или вставит в поле валидный номер, то отобразится галочка. Если пользователь уберет курсор из поля ввода, а в поле при этом останется недопустимое значение, то отобразится крестик.
Поскольку вы знаете, что телефонные номера состоят из десяти цифр, первым делом проверяете, чтобы isPhoneNumber выглядел так:

function isPhoneNumber(string) < return /\d\d\d\d\d\d\d\d\d\d/.test(string); >

В этой функции между символами / содержится регулярное выражение с десятью \d’ , то есть, символами-цифрами. Метод test возвращает true , если регулярное выражение соответствует строке, в противном случае – false . Если выполнить isPhoneNumber(«5558675309») , метод вернет true ! Ура!

Однако, писать десять \d – слегка муторная работа. К счастью, то же самое можно сделать и при помощи фигурных скобок.

function isPhoneNumber(string) < return /\d/.test(string); > 

Иногда, вводя телефонный номер, человек начинает с ведущей 1. Правда было бы неплохо, если бы ваше регулярное выражение обрабатывало и такие случаи? Это можно сделать при помощи символа?.

function isPhoneNumber(string) < return /1?\d/.test(string); > 

Символ ? означает «ноль или единица», поэтому теперь isPhoneNumber возвращает true как для «5558675309», так и для «15558675309»!

Пока isPhoneNumber вполне хороша, но мы упускаем одну ключевую деталь: регулярные выражения сплошь и рядом могут совпадать не со строкой, а с частью строки. Оказывается, isPhoneNumber(«555555555555555555») возвращает true, поскольку в этой строке десять цифр. Проблему можно решить, воспользовавшись якорями ^ и $.

function isPhoneNumber(string) < return /^1?\d$/.test(string); > 

Грубо говоря, ^ соответствует началу строки, а $ — концу строки, поэтому теперь ваше регулярное выражение совпадет с целым телефонным номером.

Серьезный пример

Релиз страницы состоялся, она пользуется бешеным успехом, но есть существенная проблема. В США телефонный номер можно записать разными способами:

  • (234) 567-8901
  • 234-567-8901
  • 234.567.8901
  • 234/567-8901
  • 234 567 8901
  • +1 (234) 567-8901
  • 1-234-567-8901

Хотя пользователи и могут обойтись без пунктуации, им было бы гораздо проще вводить заранее отформатированный номер.

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

function isPhoneNumber(string) < return /^1?\d$/.test(string.replace(/\D/g, "")); > 

Функция replace заменяет пустой строкой символ \D , соответствующий любым символам кроме цифр. Глобальный флаг g приказывает функции заменить на регулярное выражение все совпадения, а не только первое.

Еще более серьезный пример

Ваша страница с телефонными номерами всем нравится, в офисе вы – король кулера. Однако, такие профессионалы как вы не останавливаются на достигнутом, поэтому вы хотите сделать страницу еще лучше.
North American Numbering Plan – это стандарт по составлению телефонных номеров, используемый в США, Канаде и еще 23 странах. В этой системе есть несколько простых правил:

  1. Телефонный номер ((234) 567-8901) делится на три части: региональный код (234), код АТС (567) и номер абонента (8901).
  2. В региональном коде и коде АТС первая цифра может быть любой от 2 до 9, а вторая и третья цифры – от 0 до 9.
  3. В коде АТС 1 не может быть третьей цифрой, если вторая цифра – это 1.

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

Номер абонента прост, он состоит всего из четырех цифр

Региональный код немного сложнее. Нас интересует цифра от 2 до 9, за которой идут еще две цифры. Для этого можно использовать символьное множество! Символьное множество позволяет задать группу символов, из которых затем можно выбирать.

Отлично, но мы устанем вручную вводить все символы от 2 до 9. Сделаем код еще чище при помощи символьного диапазона.

Уже лучше! Поскольку региональный код такой же, как и код АТС, можно просто продублировать регулярное выражение, чтобы довести этот шаблон до ума.

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

Итак, [2-9]\d\d содержится в группе, а указывает, что эта группа должна фигурировать дважды.

Вот и все! Рассмотрим окончательный вариант функции
isPhoneNumber :

function isPhoneNumber(string) < return /^1?([2-9]\d\d)\d$/.test(string.replace(/\D/g, "")); > 

Когда лучше обходиться без регулярных выражений

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

Не будьте слишком строги. Нет никакого смысла проявлять чрезмерную строгость, когда пишешь регулярные выражения. В случае с телефонными номерами, даже если мы учтем все правила из документа NANP, все равно невозможно определить, реален ли данный телефонный номер. Если я заделаю номер(555) 555-5555, то он совпадет с шаблоном, но ведь такого телефонного номера не существует.

Не пишите HTML-парсер. Хотя регулярные выражения отлично подходят для парсинга каких-то простых вещей, синтаксический анализатор для целого языка из них не сделаешь. Если вы не любите заморачиваться, то вам вряд ли понравится разбирать нерегулярные языки при помощи регулярных выражений.

Не используйте их с очень сложными строками. Полное регулярное выражение для работы с электронной почтой состоит из 6 318 символов. Простое и приблизительное выглядит так: /^[^@]+@[^@]+\.[^@\.]+$/ . Общее правило таково: если у вас получается регулярное выражение длиннее одной строки кода, то, возможно, стоит поискать другое решение.

  • регулярные выражения
  • программирование
  • Блог компании Издательский дом «Питер»
  • Программирование
  • Регулярные выражения

Что такое регулярные выражения и как их использовать в Python

Изучите мощный инструмент работы с текстом — регулярные выражения, и научитесь использовать их в Python с нашей информативной статьей!

Алексей Кодов
Автор статьи
10 июля 2023 в 17:48

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

Основы регулярных выражений

Регулярные выражения (или regex) — это последовательность символов, которая определяет шаблон поиска в тексте. Они используются в различных языках программирования, включая Python.

Некоторые основные символы и конструкции в регулярных выражениях:

  • . (точка) — соответствует любому одному символу
  • * (звездочка) — указывает, что предыдущий символ может повторяться 0 или более раз
  • + (плюс) — указывает, что предыдущий символ может повторяться 1 или более раз
  • — указывает, что предыдущий символ должен повториться ровно n раз
  • [abc] — соответствует любому символу из указанных в квадратных скобках
  • [^abc] — соответствует любому символу, кроме указанных в квадратных скобках
  • \d — соответствует любой цифре
  • \w — соответствует любому буквенно-цифровому символу
  • \s — соответствует любому пробельному символу

Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Работа с регулярными выражениями в Python

В Python для работы с регулярными выражениями используется модуль re . Вот некоторые основные функции этого модуля:

  • re.search(pattern, string) — ищет в строке первое совпадение с шаблоном и возвращает объект Match или None , если совпадений нет
  • re.findall(pattern, string) — возвращает список всех непересекающихся совпадений с шаблоном в строке
  • re.sub(pattern, replacement, string) — заменяет все совпадения с шаблоном в строке на указанную замену

Примеры использования

import re # Поиск совпадений с шаблоном в строке pattern = r"\d+" string = "Сегодня 28 мая, завтра 29 мая" match = re.search(pattern, string) print(match) # <re.Match object; span=(7, 9), match='28'> # Нахождение всех совпадений с шаблоном в строке matches = re.findall(pattern, string) print(matches) # ['28', '29'] # Замена совпадений с шаблоном в строке replacement = "XX" new_string = re.sub(pattern, replacement, string) print(new_string) # Сегодня XX мая, завтра XX мая

Теперь вы знаете основы работы с регулярными выражениями в Python и можете использовать их для обработки текста. Удачного кодирования! ��

Регулярные выражения в JavaScript: как они устроены и для чего нужны

Один разработчик выучил все регулярки и был причислен к лику святых.

Иллюстрация: Merry Mary для Skillbox Media

Максим Сафронов

Максим Сафронов

Автор, редактор, IT-журналист. Рассказывает о новых технологиях, цифровых профессиях и полезных инструментах для разработчиков. Любит играть на электрогитаре и программировать на Swift.

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

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

Регулярные выражения — это специальные комбинации символов для поиска и обработки текста. Механика у них простая: вы составляете шаблон слова, которое вам нужно, а программа находит все строки с этим словом. Чтобы искать точнее, для шаблонов можно задавать команды — например, найти все слова без учёта регистра.

Регулярные выражения в JavaScript обычно пишут между двумя наклонными чертами. А сразу за ними идут команды — их называют «флагами».

Специальные символы

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

Представьте: вы пришли в букинистический магазин, чтобы купить редкое издание «Войны и мира» Льва Толстого 1886 года. Чтобы не копаться в стеллажах самому, скорее всего, вы обратитесь за помощью к продавцу. Продавец знает, где в магазине что лежит, и в два счёта отыщет нужную книгу.

В случае с регулярками принцип тот же: вы говорите компьютеру, что нужно найти, задаёте условия, и он ищет. Но загвоздка в том, что машина не понимает слова и предложения: ей подавай простые формальные команды, и чем короче их можно записать, тем меньше памяти всё это будет потреблять.

Один специальный символ означает одно условие поиска. Чем больше условий, тем сложнее будут комбинации символов.

Допустим, у вас есть большая база резюме разработчиков и вы хотите достать оттуда все Telegram-никнеймы. Как это сделать?

Шаг 1. Найдём все никнеймы формата @username, состоящие из латинских букв. Выражение внутри квадратных скобок означает «любая строчная латинская буква».

Что дальше

Чтобы изучить все возможности регулярок, никаких статей не хватит. Если хотите лучше в этом разбираться, почитайте книгу «Регулярные выражения» Джеффри Фридла — это хороший гайд для новичков с понятной теорией и примерами. Или попробуйте бесплатные тренажёры на сайте regexlearn.com — чтобы сразу практиковаться в изученном. Вот хорошая шпаргалка оттуда:

Читайте также:

  • Гайд для начинающих: как писать на JavaScript
  • Тест. Какой язык создадите вы — Java или Python?
  • Что такое TypeScript и как его использовать

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

Как работают замыкания в JavaScript

Обзор популярных JavaScript фреймворков

Осваиваем JavaScript с нуля: ваш путеводитель в мир программирования

Основы функционального программирования в JavaScript

Почему я считаю, что JavaScript плохой язык?

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

JavaScript, как язык программирования, активно использует регулярные выражения. В данном контексте, RegExp, встроенный объект в JavaScript, становится ключевым инструментом. Давайте рассмотрим практический пример. Представим, у нас есть большой текстовый документ на JavaScript, и мы хотим извлечь из него все email-адреса. Если бы не было регулярных выражений, пришлось бы написать множество кода для анализа каждого символа и проверки его соответствия формату email. Однако, благодаря regex в JavaScript, этот процесс становится простым и лаконичным (подробно изучить данный язык можно на курсе JavaScript Start на образовательной платформе FoxmindED).

�� Подготовься к карьере в разработке с нашим JavaScript Start .

  1. �� Обширная программа, включая среду выполнения, переменные, структуры данных, ООП и многое другое.
  2. ��️ Доступ к видео-лекциям и заданиям на 2 месяца, чтобы ты мог учиться в своем темпе.
  3. �� Помощь в чате Zulip, чтобы получить ответы на свои вопросы.
  4. �� Быстрый прогресс: студенты проходят курс за 2-4 недели.

Для примера, чтобы найти все email-адреса, мы можем использовать следующий шаблон: [\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]. Здесь [\w\.-]+ соответствует части до символа «@», [a-zA-Z\d\.-]+ — домену, а [a-zA-Z] — верхнему уровню домена (например, «.com»). Регулярные выражения в JavaScript позволяют нам описывать сложные шаблоны поиска в одной строке, упрощая задачи обработки текста и повышая читаемость кода.

Конструктор

Давайте рассмотрим различные способы создания regex в различных языках программирования, включая использование литералов и конструктора RegExp в JavaScript.

  • Использование литералов

Большинство современных языков программирования предоставляют нам простой и интуитивно понятный способ создания регулярных выражений с использованием литералов. Например, в языке JavaScript, мы можем определить регулярное выражение для поиска email-адреса следующим образом:

const emailRegex = /[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]/;

В этом примере /[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]/ — это регулярное выражение, заключенное в слеши. Это литерал regex, который можно использовать напрямую в коде.

  • Использование конструктора RegExp в JavaScript

В тех случаях, когда необходимо создавать регулярное выражение динамически, мы можем использовать конструктор RegExp в JavaScript. Например:

const dynamicPattern = "hello"; const dynamicRegex = new RegExp(dynamicPattern, "i");

Здесь dynamicPattern может быть переменной, содержащей шаблон, а флаг «i» указывает на регистронезависимый поиск. Этот подход особенно полезен, когда шаблон формируется динамически на основе внешних данных.

  • Другие языки программирования

В других языках, таких как Python, Perl, и Ruby, также существуют синтаксические сокращения и конструкторы для работы с регулярными выражениями. Однако, несмотря на различия в синтаксисе, основной принцип остается тем же — создание гибких шаблонов для работы с текстом.

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

Таким образом, создание regex — это гибкий процесс, который позволяет программистам адаптировать свои инструменты под конкретные потребности, обеспечивая эффективную обработку текстовой информации.

Основные компоненты и синтаксис

Теперь, давайте разберемся с тем, как создавать свои шаблоны.

Регулярные выражения состоят из нескольких основных компонентов:

  • Символьные классы позволяют сопоставлять определенные символы или наборы символов. Например, [0-9] соответствует любому символу из набора цифр от 0 до 9. Пример:
const digitRegex = /[0-9]/; // Matches any string containing at least one digit
  • Утверждения позволяют проверять соответствие определенной условиям. Например, ^[a-z]+$ соответствует любой строке, состоящей только из букв от «a» до «z». Пример:
const lowercaseStringRegex = /^[a-z]+$/; // Matches a string consisting of only lowercase letters
  • Группы позволяют объединять несколько символов или выражений в одно. Например, (a|b)c соответствует любой строке, содержащей один из символов «a» или «b», за которым следует символ «c». Пример:
const groupRegex = /(a|b)c/; // Matches a string containing "ac" or "bc"
  • Обратные ссылки позволяют ссылаться на ранее созданные группы. Например, (a|b)c(.*) соответствует любой строке, содержащей один из символов «a» или «b», за которым следует символ «c», а затем любое количество произвольных символов. Пример:
const backreferenceRegex = /(a|b)c(.*)\1/; // Matches a string like "acbca" or "bcdcbb"
  • Квантификаторы позволяют указать количество повторений символов или выражений. Например, a соответствует любой строке, содержащей от двух до трех символов «a». Пример:
const repeatRegex = /a/; // Matches a string containing two to three "a" characters in a row

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

Проверка и тестирование

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

Множество веб-сервисов позволяют вам в реальном времени проверить регулярное выражение, визуализировать совпадения и проводить тестирование на примерах текста, например: regex101.com, regexr.com и regexpal.com.

  • Встроенные инструменты языков программирования

Многие языки программирования предоставляют встроенные средства для тестирования regex. Например, в JavaScript существует метод test объекта RegExp, который возвращает булево значение в зависимости от того, соответствует ли текст шаблону.

Some RegEx patterns

Похожие материалы

Как работают замыкания в JavaScript

Обзор популярных JavaScript фреймворков

Осваиваем JavaScript с нуля: ваш путеводитель в мир программирования

Основы функционального программирования в JavaScript

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *