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

Источник: «Five Practical Use Cases For Regular Expressions»
Ознакомьтесь с конкретными ситуациями, в которых регулярные выражения оказываются оптимальным решение проблемы.

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

Регулярные выражения/Regular expressions, обычно называемые RegEx, представляют собой надёжные шаблоны, используемые для поиска, сопоставления и манипулирования текстовыми данными. RegEx играет важную роль при выполнении операций проверки и извлечения текста. Он предлагает мощные функциональные возможности для эффективного поиска и замены определённых шаблонов в текстовой строке.

С помощью RegEx можно обрабатывать лог-файлы, извлекать определённые данные из текстовых документов, перенаправлять URL-адреса, проверять вводимый пользователем текст в веб-формах и т.д.

Как работает RegEx

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

  1. Литералы: Регулярные выражения могут состоять из литеральных символов, которые точно совпадают друг с другом. Например, шаблон "hello" будет соответствовать строке "hello" в целевом тексте.
  2. Метасимволы: Метасимволы — специальные символы, имеющие особое значение в регулярном выражении. Примеры включают:
    • . (точка): Соответствует любому символу, кроме символа новой строки.
    • * (звёздочка): Соответствует одному или нескольким экземплярам любого символа.
    • + (плюс): Соответствует одному или нескольким вхождениям предыдущего символа.
    • ? (вопросительный знак): Соответствует нулю или одному вхождению предыдущего символа.
    • [] (квадратные скобки): Определяют класс символов, соответствуя любому символу, находящемуся в скобках.
    • () (круглые скобки): Создаёт группу захвата для захвата совпадающих подшаблонов.
  3. Модификаторы: Модификаторы задают дополнительные правила сопоставления. К числу распространённых модификаторов относятся:
    • i: Совпадение без учёта регистра.
    • g: Глобальное совпадение (совпадает со всеми вхождениями, а не останавливается на первом совпадении).
    • m: Многострочное совпадение.
  4. Якоря: Якоря используются для указания позиции совпадения в тексте. Примеры включают:
    • ^ (каретка): Соответствует началу строки.
    • $ (знак доллара): Соответствует концу строки.

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

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

Валидация данных

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

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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Форма валидации данных</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="container">
<h2 class="label">User Details</h2>
<div class="Reg_form" action="login.html" method="post" name="Login-form">
<label class="Fname">Email</label>
<input type="text" name="email" id="mail" />
<div id="InvalidEmail">Укажите валидный e-mail</div>
<label class="Fpassword">Password</label>
<input type="text" name="Password" id="Pass" />
<div id="InvalidPassword">Внимание! Вводите только правильный пароль</div>
<button type="button" onclick="validated()">Вход</button>
</div>
</div>
<script src="script.js"></script>
</body>
</html>

Добавим файл сценария, создадим script.js и добавим следующий код.

function validated () {
var emailInput = document.getElementById('mail').value
var passwordInput = document.getElementById('Pass').value

// Регулярные выражения для валидации электронной почты и пароля
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
var passwordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/

if (!emailRegex.test(emailInput)) {
document.getElementById('InvalidEmail').style.display = 'block'
document.getElementById('InvalidPassword').style.display = 'none'
return false
} else if (!passwordRegex.test(passwordInput)) {
document.getElementById('InvalidEmail').style.display = 'none'
document.getElementById('InvalidPassword').style.display = 'block'
return false
} else {
document.getElementById('InvalidEmail').style.display = 'none'
document.getElementById('InvalidPassword').style.display = 'none'
window.location.href = 'login.html'
return true
}
}

Исходный код всех примеров доступен на GitHub.

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

Мы определили два регулярных выражения, emailRegex и passwordRegex. Для emailRegex символ ^ обозначает начало строки. Шаблон [^s@]+ обозначает один или несколько символов. Символ @ обозначает часть имени пользователя в адресе электронной почты. Символ \. обозначает литеральный символ, точка и, наконец, символ $ указывает на конец строки.

Что касается passwordRegex, то шаблон /^(?=.*\d) указывает на то, что в пароле должна присутствовать хотя бы одна цифра. (?=.*[a-z]) указывает на необходимость включения одной или нескольких строчных букв, а (?=.*[A-Z]) — хотя бы одной прописной буквы. Шаблон .{8,}$/ гарантирует, что длина пароля составит не менее 8 символов. Если строка соответствует всем шаблонам, то её следует считать правильным надёжным паролем, в противном случае она не удовлетворяет требованиям. Если пароль не соответствует заданным критериям, отображается сообщение об ошибке.

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

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

Аналогичным образом, адреса электронной почты имеют определённую структуру, которая должна быть соблюдена, чтобы считаться действительной. RegEx позволяет определить шаблон, который представляет собой правильный формат адреса электронной почты. Эти шаблоны проверяют наличие таких важных компонентов, как символ "@", чтобы обеспечить правильное форматирование электронной почты и сохранить целостность контактной информации.

Поиск и замена

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

const text = "Hello, [name]! How are you, [name]?";
const namePattern = /\[name\]/g;
const replacement = "John";

const replacedText = text.replace(namePattern, replacement);
console.log(replacedText);

// Hello, John! How are you, John?

В приведённом выше коде мы определяем переменную text, содержащую пример предложения, дважды содержащего шаблон [name]. Переменная namePattern представляет собой шаблон регулярного выражения \[name\], который соответствует точной строке "[name]". Флаг g добавлен для выполнения глобального поиска и замены.

Слова поиск и замена в данном примере относятся к использованию регулярных выражений для поиска определённого шаблона в переменной text и последующей замене этого шаблона содержимым, заданным в переменной replacement.

Мы задаём переменную replacement как "John" для замены совпавшего шаблона. Используя метод replace() для строки text с аргументами namePattern и replacement, мы получаем новую строку с заменёнными совпавшими шаблонами.

Таким образом, в контекстном смысле поиск означает использование регулярного выражения namePattern для выявления всех вхождений шаблона [name] в переменную text, а замена — замену всех этих вхождений содержимым, указанным в переменной replacement, которое в данном примере равно "John".

Извлечение данных

Извлечение данных — один из распространённых вариантов использования регулярных выражений, особенно в приложениях для веб-скрапинга или анализа текста. Регулярные выражения позволяют эффективно извлекать определённую информацию из большого текста на основе заданных шаблонов. Рассмотрим реальный пример извлечения URL-адресов из текста с помощью регулярных выражений в JavaScript.

В приведённом выше примере у нас есть переменная text, содержащая образец текста с размещёнными в нем URL-адресами. Мы определяем переменную urlPattern как шаблон регулярного выражения для соответствия URL-адресам. Шаблон https?:\/\/[^\s]+ соответствует URL, начинающимся с символов "http://" или "https://", и захватывает все символы, не содержащие пробелов после них.

const text =
'Visit our website at https://www.example.com for more information. For online shopping, go to https://shop.example.com.'

const urlPattern = /https?:\/\/[^\s]+/g
const extractedURLs = text.match(urlPattern)

console.log('Extracted URLs:')
console.log(extractedURLs)

Используя метод match() для строки text с шаблоном urlPattern, мы можем извлечь все URL-адреса из текста. Метод возвращает массив extractedURLs, содержащий извлечённые URL.

В этом случае на выходе получаем (при использовании Node.js):

Extracted URLs:
[ 'https://www.example.com', 'https://shop.example.com.' ]

Этот пример демонстрирует, как регулярные выражения позволяют эффективно извлекать URL из текста.

Парсинг лога

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

Если, например, у нас есть лог со следующей структурой данных:

[2023-07-01 15:30:20] INFO: Application started.
[2023-07-01 15:32:45] ERROR: Database connection failed.
[2023-07-01 15:34:12] INFO: User logged in (username: john_doe).
[2023-07-01 15:40:03] WARNING: Disk space low, consider freeing up space.
[2023-07-01 15:45:18] ERROR: Request timed out (url: /api/data).

..., который был сохранён в файле sample.log. Мы пытаемся получить доступ к строкам с меткой "ERROR" с помощью регулярных выражений. Мы можем использовать Node.js со встроенным модулем fs для чтения файла журнала и фильтрации соответствующих записей журнала.

Приведём усовершенствованный JavaScript-код для достижения этой цели с использованием RegEx:

const fs = require('fs')

const logFilePath = 'sample.log'

fs.readFile(logFilePath, 'utf8', (err, data) => {
if (err) {
console.error(`Error reading ${logFilePath}: ${err.message}`)
return
}

const errorLines = data.match(/^\[.*\] ERROR:.*/gm)

console.log('Log entries with "ERROR" label:')
console.log(errorLines.join('\n'))
})

В приведённом выше коде мы, при помощи fs.readFile(), читаем содержимое файла sample.log. Затем с помощью метода match() для строки data с шаблоном RegEx ^\[.*\] ERROR.* находим и извлекаем строки, начинающиеся с временной метки в виде выражения со скобками ([...]) и имеющие метку "ERROR". Флаги gm соответствуют нескольким вхождениям и рассматривают входные данные как многострочную строку.

Метод match() возвращает массив errorLines, содержащий все записи лога, соответствующие шаблону.

Наконец, мы выводим в консоль записи лога с меткой "ERROR".

Очистка данных

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

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

const dataset = [
'Product A - $99.99',
'Product B: 50% off!',
'Product C - *Limited Stock*',
'Product D (New Arrival)'
]

const cleanPattern = /[^a-zA-Z0-9\s]/g
const cleanedData = dataset.map(description =>
description.replace(cleanPattern, '')
)

console.log('Cleaned Data:')
console.log(cleanedData)

Массив dataset в рассмотренном выше примере содержит описания образцов продукции. Для очистки данных мы объявляем переменную cleanPattern как шаблон регулярного выражения, который соответствует любым символам, кроме буквенных, цифровых и пробельных. Любой нежелательный специальный символ (любой символ, не являющийся алфавитно-цифровым) будет захвачен шаблоном [^a-zA-Z0-9s].

Мы снова перебираем каждое описание, используя метод map() для массива dataset. Затем с помощью метода replace() и шаблона cleanPattern заменяем нежелательные символы на пустую строку.

На выходе получаем:

Cleaned Data:
[
'Product A 9999',
'Product B 50 off',
'Product C Limited Stock',
'Product D New Arrival'
]

Заключение

Регулярные выражения/Regular expressions — универсальный инструмент программирования для решения различных задач, таких как очистка данных, разбор журналов, проверка и извлечение данных, поиск и замена. Они позволяют легко сопоставлять сложные шаблоны и обеспечивают гибкий и эффективный способ обработки текстовых операций.

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

Исходный код всех примеров доступен на GitHub в репозитории aloskutov/five-practical-use-cases-for-regular-expressions.

Дополнительные материалы

Предыдущая Статья

Понимание сериализации в PHP

Следующая Статья

Как реализовать пагинацию с помощью HTML, CSS и JavaScript